139. 单词拆分
-
解题思路:暴力递归+缓存,也就是自顶向下的动态规划。
process(s, index, wordDict)
,s[index..]
后面的能被wordDict
拼出来吗?使用一个for循环,尝试wordDict
中的所有单词。然后加一个缓存表,就可以了 -
代码
class Solution: # s2是s[i...]的一部分吗? 如果是,返回拼接到s的结束位置, 例如s[i, j]就是s2,则返回j + 1,否则返回-1 def check(self, s: str, i: int, s2: str) -> int: if i + len(s2) > len(s): return -1 for ch in s2: if ch != s[i]: return -1 i += 1 return i # 现在在凑s[index...],能凑出来吗? def process(self, s: str, index: int, wordDict: List[str], dp: List[int]) -> bool: if index == len(s): return True if dp[index] != -1: return dp[index] == 1 # 用哪个字符来凑? for str1 in wordDict: next_index = self.check(s, index, str1) if next_index != -1: next = self.process(s, next_index, wordDict, dp) if next: dp[index] = True return True dp[index] = False return False def wordBreak(self, s: str, wordDict: List[str]) -> bool: dp = [-1 for _ in range(len(s))] return self.process(s, 0, wordDict, dp)
标签:
leetcode刷题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理