题目:

给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词。

样例:

给出
s="lintcode"
dict=["lint","code"]
返回 true 因为"lintcode"可以被空格切分成"lint code"

思路:

用res[i]代表字符串s的到第i个元素为止能不能用字典中的值来表示,可以的话为true。
能够表示的条件是:1. s[j,i]能够在字典中找到; 2. 并且res[j]为true。
本题要注意的是边界条件,字符串的下标是从0开始算的,即s[0]是第1个元素,对应的是res[1].

参考答案:

class Solution {
public:
    /*
     * @param s: A string
     * @param dict: A dictionary of words dict
     * @return: A boolean
     */
    bool wordBreak(string &s, unordered_set<string> &dict) {
        // write your code here       
        unordered_set<string>::iterator it;
        
        //特殊情况
        int n= s.length();
        if(n == 0)   return true;
        if(dict.size() == 0) return false;
        
        //res[i]指的是字符串s的第i个元素为止能不能用字典中的值来表示。
        bool res[n+1];
        memset(res,false,n+1);
        /*
        也可以用向量vector<bool> res(n+1,false);
        */
        res[0] = true;
        /*时间复杂度O(n*n)
        for(int i=0; i<n; i++)
        {
            for(int j=i; res[i]&&j<n; j++)
            {
                string str = s.substr(i,j-i+1);
                if(dict.find(str) != dict.end())
                {
                    res[j+1] = true;
                }
            }
        }*/
        //时间复杂度是O(n*m)
        for(int i=1; i<=n; i++)
        {
            for(it=dict.begin(); it!=dict.end();it++)
            {
                int j = (*it).length();
                if(i<j) continue;
                cout<<s.substr(i-j,j)<<endl;
                if(*it == s.substr(i-j,j))
                {
                    if(res[i-j])
                    {
                        res[i] = true;
                    }
                }                
            }
        }
        return res[n];
    }
};

wydong
40 声望5 粉丝

wyd


« 上一篇
爬楼梯
下一篇 »
打劫房屋