Java-查找元音交换的单词的所有可能形式

Java-查找元音交换的单词的所有可能形式,java,recursion,permutation,backtracking,Java,Recursion,Permutation,Backtracking,给定一个包含元音的单词,我正在尝试编写一个方法,通过替换元音来发现这个单词的所有可能排列 例如,如果单词为“root”,则生成的集合将类似于: {"roat", "roet", "roit", "rout", "royt", "reet", "riot", "reat" ...} 我最初的策略是将其视为递归回溯问题,我编写了以下方法: public static final String VOWELS = "aeiouy"; ... vowelSwap(emptySet,

给定一个包含元音的单词,我正在尝试编写一个方法,通过替换元音来发现这个单词的所有可能排列

例如,如果单词为“root”,则生成的集合将类似于:

{"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
}
public静态最终字符串元音=“aeiouy”;
...
元音Swap(emptySet,listRepresentingString,0);//初始递归调用
专用void元音Swap(设置交换、列表、int开始){
对于(int i=start;i
这是可行的,但当一个单词中有大量元音时,会经历可怕的运行时。(一个单词中有n个元音,我相信有6^n个变体?)

我的问题是:

如果单词有多个元音,我如何处理这个问题才能更快地得到结果?


编辑:6^n变体,而不是n^6

6^n值为您提供了问题的复杂性(此外,还需要时间反复检查原始单词中的每个字母是否为元音或辅音,但这在比较中被认为太小)没有一种明智的方法可以改变这一点,事实上,你所做的是从0数到(6^n)-1,以6为基数

无论如何,您的代码并没有这样做,它只是每次替换一个元音,并没有探索所有的可能性,将值保留为n*6。当您保留最后一个元音时,您将从“根”中获得

我的想法是

1) 将空字符串“”添加到结果列表中

2) 如果字母是辅音,则将其添加到列表中所有字符串的后面。删除以前的值(字符串是不变的,因此不能仅修改列表中的对象,必须删除它并添加新的变体)

3) 如果字母是元音,则获取列表中的所有字符串,并依次放入每个元音。将所有这些结果添加到列表中(并删除以前的结果)。您将获得6x[以前的字符串数]


4) Repeat

运行时应该没有那么糟糕,我的意思是对于
n=10
,只有100万个变化,这也是问题中的一个问题,@SJuan76你能为我澄清一下我为什么没有用这个解决方案探索所有的可能性吗?我在想list.set(I,temp)调用正在执行“取消选择”操作在每次递归调用之后,我都没有注意到您重置了元音值,但无论如何,您仍然没有找到所有的组合(您将得到“raot、reot、riot、root、ruot、ryot、roat、roet….”)
raot, reot, riot, root, ruot, ryot, ryat, ryet ....