首页 > 代码库 > Word Break (14)

Word Break (14)

 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 ok[s.len+1],ok[i]的含义是长度为i的字符串是否能被字典中的单词所匹配。设ok[0]=true,即长度为0的字符串设置为能被匹配。很容易写出最优子结构。如下,有:

ok[i]=     true    (i=0)

     ok[j]&&(dict能否找到由s[j...i-1]的匹配的单词)   (  j由i-1到0,有一个为true 就break)

其思想是用ok[i]记录长度为i的字符串s[0...i]是否能被字典匹配,对于更长的字符串,如果该字符串能分为两部分,前半部分已经可以匹配了,剩下的后半部分在字典里有匹配项,则该更长的字符串也能被匹配。

上代码:

 1 class Solution { 2 public: 3    bool wordBreak(string s, unordered_set<string> &dict) { 4         int len=s.length(); 5         int i,j; 6         bool *ok=new bool[len+1]; 7         memset(ok,false,(len+1)*sizeof(bool));//这里不能为sizeof(ok),否则会wrong 8         ok[0]=true; 9         for(i=1;i<=len;i++){10             for(j=i-1;j>=0;j--){11                 if(ok[j]&&dict.find(s.substr(j,i-j))!=dict.end())12                 {13                     ok[i]=true;14                     break;15                 }16             }17         }18         return ok[len];19     }20 };

贴出一段简单的代码及其运行结果!貌似腾讯实习生笔试出过这题,但是一直不知道为什么。上文中的错误就在此处,ps:因为这个原因找了好长时间都没找到错误。

1 #include<iostream>2 3 using namespace std;4 5 int main(){6     bool *ok=new bool [100];7     cout<<sizeof(ok);//结果是48 }

 

Word Break (14)