【问题标题】:Java - Finding all possible forms of a word with vowels swappedJava - 查找交换元音的单词的所有可能形式
【发布时间】: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


【解决方案1】:

6^n 值可以让您了解问题的复杂性(此外,需要花费时间遍历原始单词中的每个字母以检查它是起誓词还是辅音,但这应该太小了比较)。没有明智的方法可以改变这一点,实际上您所做的是从 0 计数到 (6^n) - 1,以 6 为底。

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

raot, reot, riot, root, ruot, ryot, ryat, ryet ....

我的看法是

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

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

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

4) 重复

【讨论】:

  • 也解决了这个问题,@SJuan76 你能帮我澄清一下我是如何没有用这个解决方案探索所有可能性的吗?我在想 list.set(i, temp) 调用在每次递归调用后都在“取消选择”
  • 我没有注意到你重置了元音值,无论如何你仍然没有找到所有的组合(你会得到“raot, reot, riot, root, ruot, ryot, roat, roet ....")
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多