[英]Generate permutations of strings with lengths 2 to N given N letters in Java
給定以下遞歸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));
}
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);
}
}
給定N個字母,上面的代碼生成一個列表,其中包含使用所有相同N個字母的字符串的排列。 例如,給定(1,2,3),它將生成:
我最初為上面的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 );
generatePowerSet
方法將創建所有集合,因此它還包括大小為0和1的集合。您可以根據需要刪除它們,但是主要思想在那里。
樣本輸出:[3、2、1、31、13、32、23、21、12、321、312、231、213、132、123]
您需要做的就是刪除尺寸為1的尺寸。
要獲取完整的代碼,該代碼已編譯並可以正常工作,請直接在這里嘗試一下!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.