首页 > 代码库 > WordBreakII
WordBreakII
struct TrieNode{ char val; bool isEnd; TrieNode* next[26] = {NULL}; TrieNode(char x) : val(x), isEnd(false) {}};class TrieTree{private: TrieNode* root = new TrieNode(‘a‘);public: void trieInsert(string word){ TrieNode* RootTemp = root; for(int i = 0; i < word.size(); i++){ if(RootTemp->next[word[i]-‘a‘] == NULL){ RootTemp->next[word[i]-‘a‘] = new TrieNode(word[i]); RootTemp = RootTemp->next[word[i]-‘a‘]; } else{ RootTemp = RootTemp->next[word[i]-‘a‘]; } } RootTemp->isEnd = true; } void getSentense(vector<string>& result, string& sentense, string s){ string sentenseTemp = sentense; sentense.push_back(‘ ‘); TrieNode* RootTemp = root; for(int i = 0; i < s.size(); i++){ if(RootTemp->next[s[i]-‘a‘] != NULL){ RootTemp = RootTemp->next[s[i]-‘a‘]; sentense.push_back(s[i]); if(RootTemp->isEnd == true && i+1 != s.size()){ getSentense(result,sentense,string(s,i+1,s.size()-i-1)); } else if(RootTemp->isEnd == true && i+1 == s.size()){ sentense.erase(sentense.begin()); result.push_back(sentense); } } else{ sentense = sentenseTemp; return; } } sentense = sentenseTemp; }};class Solution {public: bool isBreak(string s, unordered_set<string> &dict){ if(dict.empty()) return false; vector<bool> canBreak(s.size()+1,false); canBreak[0] = true; for(int i = 1; i <= s.size(); i++){ for(int j = i-1; j >= 0; j--){ if(canBreak[j] == true){ if(dict.find(string(s,j,i-j)) != dict.end()){ canBreak[i] = true; break; } } } } return canBreak[s.size()]; } vector<string> wordBreak(string s, unordered_set<string> &dict) { vector<string> result; TrieTree myTrieTree; string sentense; if(isBreak(s,dict)){ for(auto& word : dict){ myTrieTree.trieInsert(word); } myTrieTree.getSentense(result, sentense, s); return result; }else return result; }};
用了DP和Trietree Backtracking
WordBreakII
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。