在Java中,给定N个字母,生成长度为2到N的字符串排列
给定以下递归Java方法:在Java中,给定N个字母,生成长度为2到N的字符串排列,java,combinations,Java,Combinations,给定以下递归Java方法: protected static void makeStringsList(List<String> strings, List<Character> letters) { if (letters.size() == 2) { strings.add(letters.get(0) + "" + letters.get(1)); strings.add(letters.get(1) + "" + letters.get(0))
protected static void makeStringsList(List<String> strings, List<Character> letters) {
if (letters.size() == 2) {
strings.add(letters.get(0) + "" + letters.get(1));
strings.add(letters.get(1) + "" + letters.get(0));
}
else {
Character c = letters.remove(0);
makeStringsList(strings, letters);
List<String> tempList = new ArrayList<String>();
for (String s : strings) {
StringBuffer buffer = new StringBuffer(s);
for (int index = 0; index < s.length() + 1; index++) {
buffer.insert(index, c);
tempList.add(buffer.toString());
buffer = new StringBuffer(s);
}
}
strings.addAll(tempList);
}
}
受保护的静态void makeStringsList(列出字符串,列出字母){
如果(字母.size()==2){
strings.add(字母.get(0)+“”+字母.get(1));
strings.add(字母.get(1)+“”+字母.get(0));
}
否则{
字符c=字母。删除(0);
makeStringsList(字符串、字母);
List templast=new ArrayList();
用于(字符串s:字符串){
StringBuffer=新的StringBuffer;
对于(int index=0;index
给定N个字母,上面的代码生成一个列表,其中包含使用所有相同N个字母的字符串排列。例如,给定(1,2,3),它会生成:- 123
- 132
- 213
- 231
- 312
- 321
- 它还会向列表中添加少于N个字母的字符串,但这些字符串并不详尽。使用相同的示例,23和32也在列表中,但12、21、13和31不在列表中
我最初为我以前在空闲时间工作的kata创建了上面的方法,现在我想修改它,使其更通用,并返回一个列表,其中包含长度为2到N的字符串排列,给定N个字母。是否可以修改上述方法以完成此任务?有什么建议吗?非常感谢您的建议 我想帮助解决这个问题 我认为最好的方法是生成给定字符集的幂集,然后找到幂集中每个集都可以生成的字符串组合集
List <String> allPermutationsOfSubsequences( Set <Character> chars ) {
Set < Set <Character> > powerSetOfChars = generatePowerSet ( chars );
List <String> permutations = new ArrayList <String> ();
for (Set <Character> subsequence : powerSetOfChars)
permutations.addAll( generatePermutations ( subsequence ) );
return permutations;
}
Set <Set <Character>> generatePowerSet ( Set <Character> set ) {
Set < Set <Character> > powerSet = new HashSet < Set <Character> > ();
if (set.size() == 0) {
powerSet.add(new HashSet <Character> ());
return powerSet;
}
Character anElement = set.iterator().next();
set.remove(anElement);
for (Set <Character> subset : powerSet(set)) {
Set <Character> setWithElement = new HashSet <Character> ();
setWithElement.add(anElement);
setWithElement.addAll(subset);
powerSet.add(newSet);
powerSet.add(subset);
}
set.add(anElement);
return powerSets;
}
//Generates a list of permutations of the characters provided in the set.
List <String> generatePermutations ( Set <Character> chars );
列出子序列的所有排列(设置字符){
SetpowerSetOfChars=generatePowerSet(字符);
列表置换=新的ArrayList();
用于(设置子序列:powerSetOfChars)
置换.addAll(生成置换(子序列));
返回置换;
}
Set generatePowerSet(集合){
SetpowerSet=newhashset();
if(set.size()==0){
add(新的HashSet());
返回动力装置;
}
字符anElement=set.iterator().next();
设置。移除(一个元素);
用于(集合子集:功率集合(集合)){
Set setWithElement=newhashset();
setWithElement.add(一个元素);
setWithElement.addAll(子集);
powerSet.add(新闻集);
powerSet.add(子集);
}
添加(一个元素);
返回动力装置;
}
//生成集合中提供的字符排列列表。
列出generatePermutations(设置字符);
generatePowerSet
方法创建所有集合,因此它还包括大小为0和1的集合。如果你愿意的话,你可以把它们去掉,但主要的想法就在那里
样本输出:[3,2,1,31,13,32,23,21,12,321,312,231,213,132,123]
你所需要做的就是移除大小为1的
对于完整的代码,已经编译并证明是有效的,只需到这里亲自尝试一下
我想帮助解决这个问题 我认为最好的方法是生成给定字符集的幂集,然后找到幂集中每个集都可以生成的字符串组合集
List <String> allPermutationsOfSubsequences( Set <Character> chars ) {
Set < Set <Character> > powerSetOfChars = generatePowerSet ( chars );
List <String> permutations = new ArrayList <String> ();
for (Set <Character> subsequence : powerSetOfChars)
permutations.addAll( generatePermutations ( subsequence ) );
return permutations;
}
Set <Set <Character>> generatePowerSet ( Set <Character> set ) {
Set < Set <Character> > powerSet = new HashSet < Set <Character> > ();
if (set.size() == 0) {
powerSet.add(new HashSet <Character> ());
return powerSet;
}
Character anElement = set.iterator().next();
set.remove(anElement);
for (Set <Character> subset : powerSet(set)) {
Set <Character> setWithElement = new HashSet <Character> ();
setWithElement.add(anElement);
setWithElement.addAll(subset);
powerSet.add(newSet);
powerSet.add(subset);
}
set.add(anElement);
return powerSets;
}
//Generates a list of permutations of the characters provided in the set.
List <String> generatePermutations ( Set <Character> chars );
列出子序列的所有排列(设置字符){
SetpowerSetOfChars=generatePowerSet(字符);
列表置换=新的ArrayList();
用于(设置子序列:powerSetOfChars)
置换.addAll(生成置换(子序列));
返回置换;
}
Set generatePowerSet(集合){
SetpowerSet=newhashset();
if(set.size()==0){
add(新的HashSet());
返回动力装置;
}
字符anElement=set.iterator().next();
设置。移除(一个元素);
用于(集合子集:功率集合(集合)){
Set setWithElement=newhashset();
setWithElement.add(一个元素);
setWithElement.addAll(子集);
powerSet.add(新闻集);
powerSet.add(子集);
}
添加(一个元素);
返回动力装置;
}
//生成集合中提供的字符排列列表。
列出generatePermutations(设置字符);
generatePowerSet
方法创建所有集合,因此它还包括大小为0和1的集合。如果你愿意的话,你可以把它们去掉,但主要的想法就在那里
样本输出:[3,2,1,31,13,32,23,21,12,321,312,231,213,132,123]
你所需要做的就是移除大小为1的
对于完整的代码,已经编译并证明是有效的,只需到这里亲自尝试一下
这是家庭作业,对吗?不,我不上学。我为以前的一个kata编写了这个方法,但是我想知道一些应该如何修改它的技巧,这样我就可以让它为我现在正在处理的另一个kata做一些其他的事情。我知道我需要一个递归方法,因为N是由用户指定的,在编译时是未知的。您只需要在运行时知道N,而不需要在编译时知道N。这里的伪代码和解释:谢谢,伙计们!你的解释很有帮助,我得到了我需要的。这是家庭作业,对吗?不,我不上学。我为以前的一个kata编写了这个方法,但是我想知道一些应该如何修改它的技巧,这样我就可以让它为我现在正在处理的另一个kata做一些其他的事情。我知道我需要一个递归方法,因为N是由用户指定的,在编译时是未知的。您只需要在运行时知道N,而不需要在编译时知道N。这里的伪代码和解释:谢谢,伙计们!你的解释他