/**Returns an array list containing all
* permutations of the characters in s. */
public static ArrayList<String> permute(String s) {
ArrayList<String> perms = new ArrayList<>();
int slen = s.length();
if (slen > 0) {
// Add the first character from s to the perms array list.
perms.add(Character.toString(s.charAt(0)));
// Repeat for all additional characters in s.
for (int i = 1; i < slen; ++i) {
// Get the next character from s.
char c = s.charAt(i);
// For each of the strings currently in perms do the following:
int size = perms.size();
for (int j = 0; j < size; ++j) {
// 1. remove the string
String p = perms.remove(0);
int plen = p.length();
// 2. Add plen + 1 new strings to perms. Each new string
// consists of the removed string with the character c
// inserted into it at a unique location.
for (int k = 0; k <= plen; ++k) {
perms.add(p.substring(0, k) + c + p.substring(k));
}
}
}
}
return perms;
}
public static void permute(String s) {
if(null==s || s.isEmpty()) {
return;
}
// List containing words formed in each iteration
List<String> strings = new LinkedList<String>();
strings.add(String.valueOf(s.charAt(0))); // add the first element to the list
// Temp list that holds the set of strings for
// appending the current character to all position in each word in the original list
List<String> tempList = new LinkedList<String>();
for(int i=1; i< s.length(); i++) {
for(int j=0; j<strings.size(); j++) {
tempList.addAll(merge(s.charAt(i), strings.get(j)));
}
strings.removeAll(strings);
strings.addAll(tempList);
tempList.removeAll(tempList);
}
for(int i=0; i<strings.size(); i++) {
System.out.println(strings.get(i));
}
}
/**
* helper method that appends the given character at each position in the given string
* and returns a set of such modified strings
* - set removes duplicates if any(in case a character is repeated)
*/
private static Set<String> merge(Character c, String s) {
if(s==null || s.isEmpty()) {
return null;
}
int len = s.length();
StringBuilder sb = new StringBuilder();
Set<String> list = new HashSet<String>();
for(int i=0; i<= len; i++) {
sb = new StringBuilder();
sb.append(s.substring(0, i) + c + s.substring(i, len));
list.add(sb.toString());
}
return list;
}
public static StringBuilder[] permutations(String s) {
if (s.length() == 0)
return null;
int length = fact(s.length());
StringBuilder[] sb = new StringBuilder[length];
for (int i = 0; i < length; i++) {
sb[i] = new StringBuilder();
}
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
int times = length / (i + 1);
for (int j = 0; j < times; j++) {
for (int k = 0; k < length / times; k++) {
sb[j * length / times + k].insert(k, ch);
}
}
}
return sb;
}
def getPermutation(s, prefix=''):
if len(s) == 0:
print prefix
for i in range(len(s)):
getPermutation(s[0:i]+s[i+1:len(s)],prefix+s[i] )
getPermutation('abcd','')
30条答案
按热度按时间d7v8vwbk1#
下面是另一种更简单的字符串排列方法。
nhn9ugyo2#
打印给定字符串的所有排列(考虑重复字符)并仅打印唯一字符的java实现如下所示:
x3naxklr3#
使用es6的字符串置换
使用reduce()方法
bsxbgnwa4#
如果有人想生成置换来处理它们,而不是通过void方法打印它们:
ctzwtxfj5#
我们可以使用阶乘计算以特定字母开头的字符串数量。
示例:以输入为例
d
.(3!) == 6
字符串将以字符串的每个字母开头d
.dojqjjoe6#
下面是一个简单的java最小递归解决方案:
mwyxok5s7#
lbsnaicq8#
这个没有递归
wtzytmuj9#
这是一个优雅的、非递归的o(n!)解决方案:
qxgroojn10#
其中一个简单的解决方案就是使用两个指针递归地交换字符。
xkftehaa11#
python实现
nsc4cvqm12#
使用递归。
当输入为空字符串时,唯一的排列是空字符串。请将字符串中的每个字母作为第一个字母进行尝试,然后使用递归调用查找其余字母的所有排列。
t5zmwmid13#
这就是我通过对置换和递归函数调用的基本理解所做的。需要一点时间,但这是独立完成的。
它生成的输出为
[, acb, bac, bca, cab, cba]
.其背后的基本逻辑是
对于每个字符,将其视为第一个字符并找到剩余字符的组合。例如
[](Combination of )->
.a->[bc](a x Combination of (bc))->{,acb}
b->[ac](b x Combination of (ac))->{bac,bca}c->[ab](c x Combination of (ab))->{cab,cba}
然后递归地调用每个[bc]
,[ac]
&[ab]
独立地。sr4lhrrt14#
这对我很有用。。
9avjhtql15#
让我试着用kotlin解决这个问题:
核心概念:将长列表分解为更小的列表+递归
用示例列表[1,2,3,4]给出长答案:
即使是一个4个的列表,试图列出你头脑中所有可能的排列也已经有点让人困惑了,我们需要做的就是避免这种情况。我们很容易理解如何对大小为0、1和2的列表进行所有排列,因此我们所需要做的就是将它们分解为这些大小中的任何一个,并将它们正确地组合起来。想象一台jackpot机器:该算法将从右向左旋转,然后写下
当列表大小为0或1时返回空/1的列表
当列表大小为2(例如[3,4])时处理,并生成2个置换([3,4]&[4,3])
对于每个项目,将其标记为“最后一项”中的“最后一项”,并在列表中查找该项目其余部分的所有排列(e、 g.将[4]放在table上,并再次将[1,2,3]放入排列中)
现在所有的排列都是它的子项,把它自己放回列表的末尾(例如:[1,2,3][,4],[1,3,2][,4],[2,3,1][,4],…)