word break leetcode
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"
.
这道题目初一看用笨办法,从头到尾,找到一个词然后再找剩下的词,知道找完。
但是这种naive的方法存在bug, 拿字符串 ABCDEFG 而言,如果字典是 AB, ABC, DE, FG, 那划词正确的划法只有 ABC, DE, FG, 如果直接用naive的方法发现根本没法划。
解决这个问题的办法是backtrack。
首先把问题抽象一下,把回溯的递推给写出来
如果输入为NULL,那么算 can break;
如果输入为1 那么就要查字典,看看能不能break。
如果输入为2,AB 那么就要看,首先B是不是在字典里,如果B在字典里,并且A的位置是可分的位置,那么B的位置就是个可分的,否则就不是。
pseudo code:
canwordbreak[0] =true;
for( k->lenght)
for(position = k; position>=0; position--)
if(substr(position,k) in the dict && canwordbreak[position])
canwordbreak[k+1] = true;
return canwordbreak[lenth];
bool wordBreak(string s, unordered_set<string> &dict) { int len = s.length(); vector<bool> canwordbreak(len+1, false); canwordbreak[0] = true; string substr; for(int k =1; k<=len; k++) { for(int j=k;j>=0;j--) { substr = s.substr(j,k-j); if(dict.find(substr)!=dict.end() && canwordbreak[j]) { canwordbreak[k]= true; break; } } } return canwordbreak[len]; }