leetcode: Word Break

本文介绍了一种使用冻柜解决字符串匹配问题的方法,通过动态规划和字典树优化,提高了效率并避免了超时错误。具体实现包括定义状态转移方程、初始化边界条件、迭代求解以及剪枝优化等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这种类型的题目,由于我们需要判断各种子串长度时剩余的子串是否在字典中可拼,因而可能会多次需要判断每个子串是否可拼。  单纯的搜索递归肯定比较浪费时间,会超时。  借鉴了其他人的思路,选择了冻柜来解决这个问题。dp[i]代表了从i位置开始的s的子串是否符合要求。  我们只需要从n-1到0判断dp[i]的bool值即可。  在每次判断中要求能从dict中找到一个word保证s从i开始长为word.size()的子串和word相同且dp[i+word.size()]为true即可。注意word要小于剩余子串的长度,可以利用这点来剪枝。


class Solution {
public:
    bool wordBreak(string s, unordered_set<string> &dict) {
        bool dp[1001];
        memset( dp,false,sizeof(dp));
        int l1 = s.size();
        dp[l1] = true;
        for( int i=l1-1;i>=0;i-- )
        {
            int ls = l1-i;
            for( unordered_set<string>::iterator it = dict.begin(); it != dict.end(); it++ )
            {
                int ldict = it->size();
                if( ls>=ldict && dp[i] == false )
                {
                    if(dp[i+ldict]==true && s.substr(i,ldict) == *it )
                    {
                        dp[i] = true;
                        break;
                    }
                }
            }
        }
        return dp[0];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值