为啥我不能通过 LeetCode 练习 139?

Posted

技术标签:

【中文标题】为啥我不能通过 LeetCode 练习 139?【英文标题】:Why can't I pass LeetCode exercise 139?为什么我不能通过 LeetCode 练习 139? 【发布时间】:2020-09-17 15:54:20 【问题描述】:

我在看这个leetcode challenge:

给定一个非空字符串s和一个包含非空单词列表的字典wordDict,判断s是否可以分词成一个或多个字典单词的空格分隔序列。

var wordBreak = function(s, wordDict) 
  const memo = new Map();
  const wordSet = new Set(wordDict);

  function toMemo(s) 
    if (memo.has(s)) return memo.get(s);
    if (wordSet.has(s)) 
      memo.set(s, true);
      return true
    

    for (let i = 1; i < s.length; i++) 
      let leftStr = s.substr(0, i);
      let rightStr = s.substr(i);
      if (toMemo(leftStr) && wordSet.has(rightStr)) 
        memo.set(s, true)
        return true;
      
    
    memo.set(s, true)
    return false;
  
  return toMemo(s);
;

我的代码没有通过以下测试用例:

您的意见:

"aaaaaaa"
["aaaa","aa"]

输出:true 期待:false

我该如何处理这个问题?我不明白为什么这个例子有效而我的没有?

【问题讨论】:

我得到了true 作为wordBreak("aaaaaaa", ["aaaa", "aa"]) 的结果,所以我不确定我错过了什么......是你上面的功能,还是网站?你期待false吗?看起来你的输入/输出/预期的日语标签表示......我认为这是因为输入长度既不能被 4 整除,也不能被 2 整除,因为长度是 7。我认为它适用于 ['aaaa', 'aaa']? 这个建议的解决方案似乎是你要去的地方:javascript Brute Force/ recursive approach and Brute Force/ recursive with memoization approach 不应该是 if (toMemo(leftStr) && toMemo(rightStr)) 吗? 在你返回 false 之前的 memo.set(s, true) 是否应该是 memo.set(s, false)? 【参考方案1】:

您的代码中唯一的错误是您返回false。在这种情况下,您不应该这样做:

memo.set(s, true)
return false;

但是:

memo.set(s, false);
return false;

【讨论】:

以上是关于为啥我不能通过 LeetCode 练习 139?的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 139. 单词拆分

leetcode 139. 单词拆分---完全背包问题之true or false类型

LeetCode 139 Word Break

leetcode-----139. 单词拆分

Leetcode练习(Python):链表类:第143题:重排链表:给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→

LeetCode 139. 单词拆分 | Python