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

LeetCode: Word Break [139]

【题目】

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


【题意】

    给定一个单词s和词典dict, 判定s能够用dict中的单词拼接而成


【思路】

        依次确定以每个位置i结尾的单词的前驱单词集合(只要记住前驱单词的结束位置)
        如果s[i]存在前驱集合,也就是说s[0~i]能被切割成dict中的单词
        本地要做的就是一次判断s[0-i]被切分成dict中的单词
        要判断s[0-i]只需要借助s[0-j] j=0,1,...,i-1, 存在j使得s[0-j]可分割,则只需要判断s[j+1, i],如果s[j+1, i]是dict中的单词,则可判定s[0-i]可分割
        DP问题

    


【代码】

class Solution {
public:
    bool wordBreak(string s, unordered_set<string> &dict) {
        if(s.length()==0)return false;
        vector<bool> canSegmented(s.length(), false);
        vector<int> segmentedIndex(1, -1);  //记录可被完整切分的位置
        //依次判定每个位置i上s[0-i]能够被完整切分
        for(int i=0; i<s.length(); i++){
            //根据以确定的可切分位来判断当前位
            for(int k=0; k<segmentedIndex.size(); k++){
                if(dict.find(s.substr(segmentedIndex[k]+1, i-segmentedIndex[k]))!=dict.end()){
                    canSegmented[i]=true;
                    segmentedIndex.push_back(i);
                    break;
                }
            }
        }
        return canSegmented[s.length()-1];
    }
};