题目描述
给你一个字符串 s 和一个字符串列表 word_dict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
解法


状态转移
遍历分割点 j(1 ≤ j ≤ i):
dp[j-1] == true:字符串前 j-1 个字符可以成功拆分;- 截取子串:
s.substr(j-1, i-j+1),代表从下标j-1开始,长度为i-j+1的子串; - 如果这段子串存在于单词字典中,说明:前
i个字符可以拆分,令dp[i]=true,直接 break 内层循环,不用继续找其他分割点。
cpp
#include <algorithm>
class Solution {
public:
bool wordBreak(string s, vector<string>& word_dict) {
int n = s.size();
unordered_set<string> wordDict(word_dict.begin(), word_dict.end());
vector<bool> dp(n + 1, false);
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
string word = s.substr(j - 1, i - j + 1);
if (dp[j-1] == true && wordDict.count(word)) {
dp[i] = true;
break;
}
}
}
return dp[n];
}
};