始める前に、重複した順列の別のケースを提起したことをお詫びする必要があります。ほとんどの検索結果を確認しましたが、探しているものが本当に見つかりません。辞書式順序について読み、実装しました。この質問では、aとbの数が等しい文字aとbだけで構成される長さnのすべての文字列を出力する再帰メソッドを実装することを想定しています。文字列は、辞書式順序で一度に1行ずつ印刷する必要があります。したがって、たとえば、次のように呼び出します。
printBalanced(4);
文字列を出力します:
aabb
abab
abba
baab
baba
bbaa
これがコードです
public static void main(String[] args){
printBalanced(4);
}
public static void printBalanced(int n){
String letters = "";
//string to be duplicates of "ab" depending the number of times the user wants it
for(int i =0; i<n/2;i++){
letters += "ab";
}
balanced("",letters);
}
private static void balanced(String prefix, String s){
int len = s.length();
//base case
if (len ==0){
System.out.println(prefix);
}
else{
for(int i = 0; i<len; i++){
balanced(prefix + s.charAt(i),s.substring(0,i)+s.substring(i+1,len));
}
}
}
私の印刷結果:
abab
abba
aabb
aabb
abba
abab
baab
baba
baab
baba
bbaa
bbaa
aabb
aabb
abab
abba
abab
abba
baba
baab
bbaa
bbaa
baab
baba
ご覧のとおり、重複がたくさんあります。これは、文字「a」と「b」のみを使用する必要があるためです。「abcd」または「0123」の場合、重複は発生しません。配列リストの使用について読み、すべての結果を保存してから、N個の要素をループして重複をチェックし、それを削除しました。これはそれを行うための最良の方法ではないようです。誰かがこの問題の他のより良い解決策について共有できますか?=)
SortedSetを使用した私のソリューション:
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
public class BalancedStrings {
public static void main(String[] args){
printBalanced(4);
}
public static void printBalanced(int n){
String letters = "";
for(int i =0; i<n/2;i++){
letters += "ab";
}
SortedSet<String> results = balanced("",letters);
Iterator<String> it = results.iterator();
while (it.hasNext()) {
// Get element and print
Object element = it.next();
System.out.println(element);
}
}
//This method returns a SortedSet with permutation results. SortedSet was chosen for its sorting and not allowing
//duplicates properties.
private static SortedSet<String> balanced(String prefix, String s){
SortedSet<String> set = new TreeSet<String>();
int len = s.length();
//base case
if (len == 0){
//return the new SortedSet with just the prefix
set.add(prefix);
return set;
}
else{
SortedSet<String> rest = new TreeSet<String>();
for(int i = 0; i<len; i++){
//get all permutations and store in a SortedSet, rest
rest = balanced(prefix + s.charAt(i),s.substring(0,i)+s.substring(i+1,len));
//put each permutation into the new SortedSet
set.addAll(rest);
}
return set;
}
}
}