我已经处理以下递归问题已有一段时间了,但一直无法弄清楚。基本上,您是由某些单词组成的某种句子,其中所有单词只是卡在了一起,而不是隔开。这个想法是找到可用于创建句子的单词的所有可能组合的数量。

例如,


词:ook,ookook
句子:ookookook
解决方案:{ook,ook,ook},{ookook,ook},{ook,ookook}。


另一个例子:


单词:ooga,oogam,oogum,mook,ook
句子:oogamookoogumook
解决方案:{ooga,mook,oogum,ook},{oogam,ook,oogum,ook}


我尝试了很多事情,最终放弃并尝试手动进行...

public static int WAYS(String word) {
    int ways = 1;
    for (int i = 0; i < word.length(); i++) {
        try{
            if(word.substring(i, i - 2).equals("ug")){
                if(word.substring(i - 4, i - 2).equals("ug")){
                    ways++;
                }
            }
            else if(word.substring(i, i - 3).contains("ook")){
                System.out.println(word.substring(i-6, i-3));
                if(word.substring(i - 6, i - 3).equals("ook")){
                    ways++;
                }
                if(word.charAt(i - 4) == 'm'){
                    if(word.substring(i - 8, i - 4).equals("ooga") || word.substring(i - 8, i - 4).equals("oogu")){
                        ways++;
                    }
                }
            }
            else if(word.substring(i, i - 4).contains("mook")){
                if(word.substring(i - 8, i - 4).contains("mook")){
                    ways++;
                }
            }
            if(word.substring(i, i - 2).equals("oog")){
                if(word.charAt(i + 2) == 'm'){
                    if(word.charAt(i + 1) == 'a' || word.charAt(i + 1) == 'u'){
                        ways++;
                    }
                }
            }
        } catch(Exception e){
            continue;
        }
    }
    return ways;
}


但这没有用。有人可以给我一个想法或示例,以解决使用递归的问题吗?

最佳答案

1)正确命名您的方法,“ WAYS”是常量名称,而不是方法名称。

2)提供可运行的代码,尤其是在它如此短的情况下。

3)切勿将异常用于控制流。

4)您在代码中使用魔术值,例如“ uug”和“ ook”吗?这看起来简单又明显吗?这看起来可以维护吗?如果您得到一个包含一百万个不同单词的词典,那应该是什么样?

编辑:给出完整的清单有点无聊,所以我留下了一些空白。尝试填补这些,希望对您有所帮助。

public class JammedWords {
  public static int ways(String sentence, String[] words) {
    if (sentence.isEmpty()) {
      // The trivial case: the sentence is empty. Return a single number.
    } else {
      int c = 0;
      for (String w: words) {
        if (sentence.startsWith(w)) {
          // call method recursively, update counter `c`.
        }
      }
      return c;
    }
  }
  public static void main(String[] args) {
    System.out.println(ways("ookookook", new String[]{"ook", "ookook"}));
    System.out.println(ways("oogamookoogumook", new String[]{"ooga","oogam","oogum","mook","ook"}));
  }
}


提示:

A)了解空集,包含空集的集,包含空集的集等之间的区别。包含空集的集当然不为空,并且其大小也不为0。

B)有一个方便的方法String.substring(n)将所有内容都放在第n个字符之前。还有String.length()来获取单词的大小。

10-06 03:37