我的Q类似于过去在堆栈溢出时询问的问题 http://www.geeksforgeeks.org/dynamic-programming-set-32-word-break-problem/
我写的解决方案,我无法理解,因为我不使用DP,但我的解决方案是如何解决重叠问题。我认为不是。有人可以澄清吗? 我使用的词典是{“cat”,“catdog”,“dog”,“mouse”}和测试字符串为“catdogmouse” 这是我写的方法
public static boolean recursiveWordBreak2(String s, int start) {
System.out.println("s is:"+s.substring(start));
if (s.isEmpty() || start >= s.length()) {
return true;
}
for (int i = start; i <= s.length(); i++) {
String str = s.substring(start, i);
System.out.println("substr:" + str);
if (dictSet.contains(str)) {
return recursiveWordBreak2(s, i);
}
}
return false;
}
答案 0 :(得分:0)
您的解决方案使用递归-only-。认识到该问题是DP允许您记住(记住)以前的结果,以便您可以重用它们而无需再次进行递归。
在你提供的链接中,如果字典是{a,b,c,d,e},输入是&#34; abcde&#34;,你需要检查&#34; cde&#34;使用递归代码有效两次,其中DP解决方案会记住&#34; cde&#34;是有效的,只需要检查一次。
编辑:字典{a,b,c,d,e}应该是{a,ab,cde}来说明检查&#c;&#39;两次
edit2(请参阅有关逻辑问题的算法的评论):
if (dictSet.contains(str)) {
return recursiveWordBreak2(s, i);
}
应该是
if (dictSet.contains(str) && recursiveWordBreak2(s, i)) { return true }
如果contains = true但是recursiveWB = false,外部循环将继续检查长度+ 1而不是返回false