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];
                
    }

 

 

 

 

posted @ 2014-02-07 13:36  来自海边的一片云  阅读(127)  评论(0编辑  收藏  举报