Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
For example, given
s = "leetcode"
,
dict = ["leet", "code"]
.
Return true because "leetcode"
can be segmented as "leet code"
.
思路:动态规划。申请一个 bool 数组 marks,初始化为false。
marks[i] = true if 1) s.substr(0,i) 是字典里的一个单词
2) 或者存在一个 j,使得 marks[j]=true 而且 s.substr(j+1, i) 是个字典里的单词。
代码:
bool wordBreak(string s, unordered_set<string> &dict) { bool* marks = new bool[ s.length() ]; memset(marks, 0, s.length() ); //初始化 for(int i=0; i<s.length(); i++) { if( dict.find( s.substr(0, i+1) ) != dict.end() ) *(marks+i) = true; if(i>0) for(int j=0; j<i; j++) { if( *(marks+j)==true && ( dict.find( s.substr(j+1, i-j) ) != dict.end() ) ) { *(marks+i) = true; break; } } } return *(marks+s.length()-1); }
----------------------------------------------------------------------
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog"
,
dict = ["cat", "cats", "and", "sand", "dog"]
.
A solution is ["cats and dog", "cat sand dog"]
.
下面的代码可以输出word break的结果。
vector<string> wordBreak(string s, unordered_set<string> &dict) { vector< vector<string> > wordBreaks; //wordBreaks[i] 是s.substr(0,i) 所有可能的break的结果 int len = s.length(); for(int i=0; i<len; i++) { vector<string> vec; wordBreaks.push_back(vec); if(dict.find( s.substr( 0, i+1) ) != dict.end()) { string str = s.substr( 0, i+1 ); wordBreaks[i].push_back(str); } if(i>0) for(int j=0; j<i; j++) { if( wordBreaks[j].size() > 0 && dict.find( s.substr( j+1, i-j ) ) != dict.end() ) { for(int k=0; k<wordBreaks[j].size(); k++) { string str = wordBreaks[j][k]; str = str + " " + s.substr( j+1, i-j ); wordBreaks[i].push_back(str); } } } } return wordBreaks[len-1]; }