经典的DP
与记忆化递归
的题,很值得一做.
139. 单词拆分
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict*,判定 *s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
- 拆分时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
示例 1:
1 | 输入: s = "leetcode", wordDict = ["leet", "code"] |
示例 2:
1 | 输入: s = "applepenapple", wordDict = ["apple", "pen"] |
示例 3:
1 | 输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] |
DP
用一个dp数组
记录子串是否存在于wordDict
中,其中dp数组
最重要的作用是判断s
被拆分的子串是否能完整的都出现在wordDict
中
方法一
1 | class Solution { |
方法二
方法二是将方法一优化了下,减少了比较的次数.
1 | class Solution { |
记忆化递归
记忆化递归的本质是用一种数据结构去存储已经求解的结果(有点类似于DP的思想了),减少求解的次数,并且通过递归的方式逐渐趋近于答案.
1 | class Solution { |