母音を含む単語が与えられた場合、母音を交換することによって作成されたこの単語のすべての可能な順列を検出するメソッドを作成しようとしています。
たとえば、単語が「root」の場合、結果の Set は次のようになります。
{"roat", "roet", "roit", "rout", "royt", "reet", "riot", "reat" ...}
私の最初の戦略は、これを再帰的なバックトラッキングの問題のように扱うことでした。私は次の方法を書きました:
public static final String VOWELS = "aeiouy";
...
vowelSwap(emptySet, listRepresentingString, 0); // the initial recursive call
private void vowelSwap(Set<String> swaps, List<Character> list, int start) {
for (int i = start; i < list.size(); i++) {
if (isVowel(list.get(i))) {
// do some vowel swapping on this character
for (int j = 0; j < VOWELS.length(); j++) {
if (list.get(i) != VOWELS.charAt(j)) {
char temp = list.get(i);
list.set(i, VOWELS.charAt(j));
String s = stringify(list);
swaps.add(s);
vowelSwap(swaps, list, i + 1);
list.set(i, temp);
}
}
}
}
public static String stringify(List<Character> list) {
...
a method that converts a List<Character> to String
}
これは機能しますが、単語に多数の母音が含まれていると、ひどい実行時間が発生します。(単語に n 個の母音が与えられた場合、6^n 個のバリエーションがあると思いますか?)
私の質問はこれです:
母音の多い単語の場合に、より迅速に結果が得られるように、この問題にどのようにアプローチできますか?
編集: n^6 ではなく、6^n のバリエーション