我已经处理以下递归问题已有一段时间了,但一直无法弄清楚。基本上,您是由某些单词组成的某种句子,其中所有单词只是卡在了一起,而不是隔开。这个想法是找到可用于创建句子的单词的所有可能组合的数量。
例如,
词: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()来获取单词的大小。