【问题标题】:recursive anagram in javajava中的递归字谜
【发布时间】:2015-07-03 20:11:44
【问题描述】:

我在实现算法以在给定字符串中查找字谜时遇到问题。下面的方法不会返回正确的输出。例如,给定单词“abc”,它返回 [abc, bc, c, bc, bc, c]。当它真的应该只是 [abc, bac, bca, acb, cab, acb]

private List<String> anagramizeRecursive(String word) {
    if(word.length() == 0) {
        return null;
    }
    else {
        for(int i = 0; i < word.length()-1; i++) {
            unfiltered.add(word.substring(i));
            anagramizeRecursive(word.substring(i+1));
            unfiltered.add(word.substring(i+1));
        }
    }
    return unfiltered;
}

【问题讨论】:

  • unfiltered 列表在哪里被实例化?
  • 你的预期输出是什么?
  • @JorgeCampos 它是一个类变量它是一个字符串数组列表
  • @Masud 它缺少前面带有 a 的字谜,我假设因为 bc 和 c 重复
  • 您确定要查找字谜吗?如果是这样,您可能需要在递归帧中传递一些列表。

标签: java list recursion arraylist


【解决方案1】:

对于原始字符串中的每个字符,您希望将该字符移到前面,然后将其添加到由其余字符串组成的所有字谜中。

List<String> anagramRecursive(String word)
  result = empty list
  if word.isEmpty() result.add("")
  else 
    for each character c in word
      for each item in anagramRecursive(word-c)
        result.add(c + item)
  return result

还有许多其他构造递归的方法,但这与您已经拥有的最相似。

【讨论】:

  • 要做到这一点,我是否必须将 word 转换为字符数组并循环遍历每个字符?
【解决方案2】:

来自https://www.techiedelight.com/generate-permutations-string-java-recursive-iterative/

private static void permutations(String candidate, String remaining)
        {
            if (remaining.length() == 0) {
                System.out.println(candidate);
            }
    
        for (int i = 0; i < remaining.length(); i++)
        {
            String newCandidate = candidate + remaining.charAt(i);

            String newRemaining = remaining.substring(0,i) + remaining.substring(i + 1);

            permutations(newCandidate, newRemaining);
        }
    }

public static void main(String[] args)
    {
        String s = "ABC";
        permutations("", s);
    }

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 2018-05-18
    • 2015-12-28
    • 2019-02-06
    • 2019-01-15
    • 2014-04-03
    • 2020-06-20
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多