【问题标题】:Complexity of the word break algorithm分词算法的复杂性
【发布时间】:2016-10-17 01:46:22
【问题描述】:

我的 Q 类似于过去关于堆栈溢出的问题 http://www.geeksforgeeks.org/dynamic-programming-set-32-word-break-problem/

我写的解决方案,我无法理解,因为我不使用 DP,但我的 sol 如何解决重叠问题。我认为不是。有人可以澄清吗? 我使用的字典是 {"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;
}

【问题讨论】:

标签: algorithm recursion dynamic-programming


【解决方案1】:

您的解决方案仅使用递归。认识到这个问题是 DP 允许您 MEMOIZE(记住)以前的结果,以便您可以重用它们而无需再次进行递归。

如果字典是 {a,b,c,d,e} 并且输入是“abcde”,则在您提供的链接中,您需要使用递归代码检查“cde”是否有效两次,其中 DP解决方案会记住“cd​​e”是有效的,只需要检查一次。

编辑:字典 {a,b,c,d,e} 应该是 {a,ab, cde} 以说明检查 'cde' 两次

edit2(参见关于算法有逻辑问题的评论):

if (dictSet.contains(str)) {
return recursiveWordBreak2(s, i);  
} 

应该是

if (dictSet.contains(str) && recursiveWordBreak2(s, i)) { return true }

这样如果 contains = true 但 recursiveWB = false,外循环将继续检查 length+1 而不是返回 false

【讨论】:

  • 在我的代码中,如果您的建议正在发生,为什么我看不到多次打印的子字符串。 substgrin“cde”应该打印不止一次。我有打印声明。所以要么我的算法是错误的?或者我不需要在这个中进行记忆并且它已经优化了?我无法看到重复发生在哪里,因为我在打印时没有看到任何子字符串在输出中重复(请参阅代码中的打印语句)
  • 尝试字典 = {a, ab, cde}。我认为您的算法从不尝试匹配“ab”
  • 所以现在我明白了你的意思,我没有在我的算法中看到重叠的问题,因为我什至没有检查所有子问题,因此对于你给出的情况,我得到的输出为 false .不要贪心,但你能建议一个可以修复算法的小调整吗?你找到了一个好点。
  • 你的链接中的伪代码实际上已经提供了解决方案,我在这里复制了它
  • 谢谢,你复制它的链接在哪里?不要在你的帖子中看到它你正在谈论的链接
猜你喜欢
  • 2019-10-05
  • 2013-10-12
  • 2023-03-03
  • 2016-07-04
  • 1970-01-01
  • 2015-04-24
  • 2015-04-25
  • 1970-01-01
相关资源
最近更新 更多