leetcode Word Break II

来源:互联网 发布:数据大师埋雷 编辑:程序博客网 时间:2024/06/05 16:28
int length;
    vector<string> one_result;
    vector<string> result;
    vector<vector<bool> > is_word;
    
    void backTrack(string &s, int last, int index, vector<string> &one_result)
    {
        if(last == length)
        {
            string str;
            for(int i = 0; i < one_result.size(); ++i)
            {
                str.append(one_result[i]);
                if(i != one_result.size() - 1)
                    str.append(" ");
            }
            result.push_back(str);
            return;
        }
    
        for(int i = last; i < length; ++i)
        {
            if(is_word[last][i])
            {
                one_result.push_back(s.substr(index, i - index + 1));
                backTrack(s, i+1, i+1, one_result);
                one_result.pop_back();
            }
        }
    }
    
    vector<string> wordBreak(string s, unordered_set<string>& wordDict)//unordered_set
    {
        if(s.empty() || wordDict.empty())
            return result;
    
        length= s.size();
        is_word.assign(length, vector<bool>(length, false));
        for(int i = 0; i < length; ++i)
        {
            for(int j = i; j < length; ++j)
            {
                if(wordDict.count(s.substr(i, j - i + 1)) > 0)
                    is_word[i][j] = true;
            }
        }
        
        //第一个字母开头就不能划分
        int index = 0;
        for(index = 0; index < length; ++index)
        {
            if(is_word[0][index])
                break;
        }
        if(index == length)
            return result;
        
        //最后一个单词不能划分
        index = 0;
        for(index = 0; index < length; ++index)
        {
            if(is_word[index][length-1])
                break;
        }
        if(index == length)
            return result;
        
        backTrack(s, 0, 0, one_result);
        return result;
    }
0 0