对于以下算法:
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine if s can be segmented into a space-separated sequence of one or more dictionary words. You may assume the dictionary does not contain duplicate words
For example, given
s = "leetcode",
dict = ["leet", "code"].
Return true because "leetcode" can be segmented as "leet code".
我写了以下代码:
def word_break(s, word_dict)
can_break?(s, word_dict, memo = {})
end
def can_break?(s, word_dict, memo)
return true if s.empty?
(0...s.length).each do |index|
string_to_pass = s[index + 1...s.length]
memo[string_to_pass] ||= can_break?(string_to_pass, word_dict, memo)
return true if word_dict.include?(s[0..index]) && memo[string_to_pass]
end
false
end
我对这里的分析的理解是,我们有递归调用的数量与输入字符串大小线性缩放(因为我们使用memoization减少了递归调用的数量),并且每个递归调用N都工作(扫描通过数组)。这是评估O(N ^ 2)时间和O(N)空间吗? (请注意字典是数组,而不是哈希)。
答案 0 :(得分:0)
这是对理由的一个很好的总结;是的,你是对的。
从理论的角度来看,通过记忆,每个角色都需要作为m
扫描的起点,其中m
是到角色较近端的距离。您可以应用各种标量级优化,但复杂性仍然 O (N ^ 2)