版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/artisans/article/details/88944545
给定一个非空字符串 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
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
vector<int> dp(s.size(), -1);
string s0(s.begin(), s.begin() + 1);
dp[0] = std::find(wordDict.begin(), wordDict.end(), s0) != wordDict.end();
calc(s, wordDict, dp, s.size() - 1);
return dp.back();
}
bool calc(string &s, vector<string>& wordDict, vector<int>& dp, int i)
{
if (dp[i] != -1) return dp[i];
//不拆分
string str(s.begin(), s.begin() + i + 1); //[0, i]
if (std::find(wordDict.begin(), wordDict.end(), str) != wordDict.end())
{
dp[i] = 1;
return true;
}
bool flag = true;
for (int k = 0; k < i; k++)
{
if (calc(s, wordDict, dp, k))
{
string str(s.begin() + k + 1, s.begin() + i + 1);//判断 [k+1, i] 是否在字典中
if (std::find(wordDict.begin(), wordDict.end(), str) != wordDict.end())
{
dp[i] = 1; flag = false;
}
}
}
if (flag) dp[i] = 0;
return dp[i];
}
};