首页 > 代码库 > [LeetCode] Word Break

[LeetCode] Word Break

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".

Solution:

LTE Code:

string srcStr;unordered_set<string> dic;bool word_break(int start){    //cout << "Start with " << start << endl;    if(start >= srcStr.length())         return true;    for(int i = start;i < srcStr.length();i++)    {        string curStr = srcStr.substr(start, i - start + 1);        if(dic.find(curStr) != dic.end())        {            //return word_break(i+1); //The reason is that if current recursion return false, doest not mean the             //break should fail, we need to check other combinations.            if(word_break(i + 1))                 return true;            else                 continue;        }        else continue;    }    return false;}bool wordBreak(string s, unordered_set<string> &dict) {        srcStr = s;        dic = dict;        return word_break(0);    }

AC Code:

string srcStr;unordered_set<string> dic;int visited[1000][1000];int checked[1000];string srcStr;unordered_set<string> dic;int visited[1000][1000];int checked[1000];bool word_break(int start){    //cout << "Start with " << start << endl;    if(start >= srcStr.length())         return true;    for(int i = start;i < srcStr.length();i++)    {        string curStr = srcStr.substr(start, i - start + 1);        int finded = 0;        if(visited[start][i] == 1)            finded = true;        else if(visited[start][i] == 2)            finded = false;        else        {            finded = (dic.find(curStr) != dic.end()) ? 1 : 2;            visited[start][i] = finded;        }        if(finded == 1)        {            if(checked[i + 1] == 1)                return true;            else if(checked[i + 1] == 2)                continue;            else             {                checked[i + 1] = word_break(i + 1) ? 1 : 2;                if(checked[i + 1] == 1)                    return true;                else                    continue;            }        }        else continue;    }    return false;}bool wordBreak(string s, unordered_set<string> &dict) {        srcStr = s;        dic = dict;        for(int i = 0;i < 1000;i++)            memset(visited[i], 0, sizeof(int) * 1000);        memset(checked, 0, sizeof(int) * 1000);        if(s.length() > 1000) return false;        return word_break(0);    }