140. Word Break II

本质就是往s里面插空格,确认valid就是检查跟上一个空格间的string是否是dict中的词,合格的话就记录一下状态,然后继续往下试。这个方法很容易想到backtracking,每个位置都需要判断插空格or不插,时间复杂度在O(2**n),提交TLE了。

既然TLE就检查哪里有重复运算,发现对于不同的前部分分割,存在可能相同的后部分分割,或者说,对于同样的后部分分割,存在可能相同的前部分分割。或者更加 generally,对于某个重复出现的pattern,其分割方式可以是一样的,那就不需要重复运算。

比如 example 2 里的 "pineapple" 这个pattern:

Output:
[
  "pine apple pen apple",
  "pineapple pen apple",
  "pine applepen apple"
]

如果用hashmap来记录一下某string的有效分割结果,就可以避免重复运算。这样就是把 backtracking变成了一个记忆化搜索(or you can call it DP whatever)。

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
        self.result = set()
        self.backtracking(wordDict, -1, s)
        return self.result
        
    def backtracking(self, wordDict, last, path):
        for idx in range(last+1, len(path)):
            if path[last+1:idx+1] in wordDict:
                if idx+1 == len(path):
                    self.result.add(path)
                else:
                    self.backtracking(wordDict, idx+1, path[:idx+1]+' '+path[idx+1:])

Last updated

Was this helpful?