LeetCode || Word Break

本文探讨了如何解决字符串分割问题,通过使用动态规划的方法来判断一个字符串是否能被拆分成字典中的词汇序列。文章提供了详细的算法思路及C++实现代码。

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

Word Break

  Total Accepted: 15419  Total Submissions: 75670 My Submissions

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中的词构成。开始时想到的方法是,遍历dict中的词,然后判断其在s中是否存在,如果存在就将该词替换为空串,最终看s是否变为空串,这种方法是错误的,比如 s=“dogs”,dict=[ "gs", "s", "dog" ],判断的时候会首先剔除s中的gs,剩下do,显然判断为false。

       正确的方法是使用动态规划,定义一个bool数组dp[ len ],len为字符串长度,递推方程为:dp[ i ] = dict.find( s.substr( 0, i+1 ))  OR (dp[ j ] && dict.find(s.substr( j+1, i-j )));

即dp[ i ] 的值为true,等价于子串(0,i)是dict的一个词或者存在j<i ,使得dp[ j ] 为真并且子串(j,i)也在dict出现;

代码如下:


class Solution {
public:
    bool wordBreak(string s, unordered_set<string> &dict) {
        int len = s.length();
        if(len<1)
            return true;
        bool *dp = new bool[len];
        memset(dp, false, len);
        for(int i = 0; i<len; ++i){
            if(dict.find(s.substr(0, i+1)) != dict.end())
                dp[i] = true;
            else{
                for(int j=0; j<i; ++j){
                    if(dp[j] && dict.find(s.substr(j+1, i-j)) != dict.end()){
                        dp[i]=true;
                        break;
                    }
                }
            }
        }
        return dp[len-1];
    }
};

该方法的时间复杂度应该是 O(len^2 * logX),其中X为dict的长度,len为字符串s的长度。logX为在dict中find一个子串的时间(如果dict用树实现的话)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值