【leetcode】139. 单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-break
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
值得学习的一点是把这个看成树,然后进行广度优先遍历。
广度优先存储的是开始遍历的index。
一开始我是考虑用一颗字典树进行存储,然后进行深度优先遍历,然后没有进行编码,其实也可以尝试一下的,感觉也是一种类似的思路。
给我最大的启发还是queue ==> 来实现的广度优先遍历的机制。
另一种做法是用dp ,这个参考官方题解就很清楚了应该。
代码
class Solution {
private:
public:
bool wordBreak(string s, vector<string>& wordDict) {
const int N = s.size();
vector<bool> visited(N, false);
map<char, vector<string>> trie;
for (string str : wordDict) {
trie[str[0]].push_back(str);
}
queue<int> q;
q.push(0);
while(!q.empty()) {
int start = q.front();q.pop();
if (start == N) return true;
if (visited[start]) continue;
visited[start] = true;
for (string str : trie[s[start]]) {
if (str != s.substr(start, str.size())) continue;
q.push(start + str.size());
}
}
return false;
}
};