LINTCODE——单词切分

LINTCODE——单词切分

思路:本来是用回溯的,结果严重超时,然后改成动态规划,解决了,这里需要说明的有两点,
第一点:在动态规划计算的时候,采用从i到0的顺序进行计算,这样会优化一点,然后如果得到mark[i]为TRUE(即前i个字符串可以分割的话),直接break,进行下一次循环;
第二点:最好在每次新加入s[i]的时候去字典里面查找,确定s[i]是否存在dict中,如果不存在,那就不用找了,直接退出(false);

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
        if(s.empty())
            return true;
        //新建一个字符串sd,统计所有dict里面的字符
        string sd;
        for(auto x:dict)
            sd+=x;

        int n = s.size();
        vector<bool> mark(n+1,false);
        mark[0] = true;
        for(int i = 0 ; i < n ; i++)
        {
            //判断s里面的字符是否存在dict中,如果不存在,直接退出
            if(!check(sd,s[i]))
                return false;
            for(int j = 0 ; j <= i ;j++)
            {
                string stemp = s.substr(i-j,j+1);
                bool temp = dict.find(stemp) != dict.end();
                mark[i+1] = mark[i+1]||(mark[i-j]&&temp);
                if(mark[i+1])
                    break;
            }
        }

        return mark[n];
    }
    bool check(string &sd,char c)
    {
        for(int i = 0 ; i < sd.size(); i++)
        {
            if(sd[i] == c)
                return true;
        }
        return false;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值