分词算法的复杂性

时间:2016-10-17 01:46:23

标签: algorithm recursion dynamic-programming

我的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;
}

1 个答案:

答案 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