一、题目

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
注意你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

二、思路


  • dp[i]:表示字符串以i结尾是否可以由wordDict组成,为0代表不可以,为1代表可以
  • 二重循环遍历可能的单词组合,然后判断可以否由前面的串转移过来,若可以设置为true

三、代码

class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int n = s.size(), L = 0;
vector<int> dp(n + 1);
unordered_map<string, int> mp;
for (string& t: wordDict) {
mp[t] = 1;
L = L > t.size() ? L : t.size();
}
dp[0] = 1;
for (int i = 0; i < n; i++) {
for (int j = 1; j <= L && (i + j) <= n; j++) {
string t = s.substr(i, j);
if (mp.count(t)) dp[i + j] |= dp[i]; //dp以1为开始索引
}
}
return dp[n];
}
};