【发布时间】:2013-05-17 00:43:15
【问题描述】:
给定一个包含元音的单词,我正在尝试编写一种方法,该方法将通过交换元音来发现该单词的所有可能排列。
例如,如果单词是“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 个变体?)
我的问题是:
对于包含许多元音的单词,我如何才能以一种更快的方式解决这个问题?
编辑:6^n 变体,而不是 n^6
【问题讨论】:
-
runtime 应该没那么糟糕,我的意思是
n=10,只有一百万种变化,眨眼就行了
标签: java recursion permutation backtracking