leetcode 139. Word Break

这道题用动态规划解决。

cpp 复制代码
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> wordSet;
        for(string& word:wordDict){
            wordSet.insert(word);
        }
        int s_len = s.size();
        //s的下标从1开始起算,dp[j]表示s[1,j]能拆分成wordDict的组合
        vector<bool> dp(s_len+1,false);
        dp[0] = true;//表示空串

        for(int len = 1;len <= s_len;len++){//对s[1,len]遍历
            for(int i = 0;i < len;i++){//对s[1,len]的拆分点遍历
                if(dp[i] && wordSet.find(s.substr(i,len-i)) != wordSet.end()){
                    dp[len] = true;
                    break;
                }
            }
        }
        return dp[s_len];
    }
};

可以事先确定,wordDict中最长的单词的长度max_word_len。这样在考虑s.sub(i,len-i)时候,如果len-i大于max_word_len就可以直接跳过这种情况。

优化后的代码:

cpp 复制代码
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> wordSet;
        int max_word_len = 0;
        for(string& word:wordDict){
            wordSet.insert(word);
            if(word.size() > max_word_len) max_word_len = word.size();
        }
        int s_len = s.size();
        //s的下标从1开始起算,dp[j]表示s[1,j]能拆分成wordDict的组合
        vector<bool> dp(s_len+1,false);
        dp[0] = true;//表示空串

        for(int len = 1;len <= s_len;len++){//对s[1,len]遍历
            for(int i = 0;i < len;i++){//对s[1,len]的拆分点遍历
                if(len -i > max_word_len)
                    continue;
                if(dp[i] && wordSet.find(s.substr(i,len-i)) != wordSet.end()){
                    dp[len] = true;
                    break;
                }
            }
        }
        return dp[s_len];
    }
};
相关推荐
yanxing.D13 分钟前
考研408_数据结构笔记(第四章 串)
数据结构·笔记·考研·算法
庸子28 分钟前
云平台托管集群:EKS、GKE、AKS 深度解析与选型指南-第四章
算法·贪心算法
এ᭄画画的北北1 小时前
力扣-11.盛最多水的容器
算法·leetcode
啊阿狸不会拉杆1 小时前
《算法导论》第 7 章 - 快速排序
开发语言·数据结构·c++·算法·排序算法
冬夜戏雪2 小时前
java学习 73矩阵置零 54螺旋矩阵 148排序链表
数据结构·算法·矩阵
小酒星小杜2 小时前
我和女神有个约会之差点因为二维码太丑搞砸了🔥
前端·javascript·算法
Dream it possible!2 小时前
LeetCode 面试经典 150_数组/字符串_O(1)时间插入、删除和获取随机元素(12_380_C++_中等)(哈希表)
c++·leetcode·面试·哈希表
快去睡觉~2 小时前
力扣137:只出现一次的数字Ⅱ
数据结构·算法·leetcode
阑梦清川2 小时前
folo介绍和fluent reader阅读器的使用(RSS订阅技术)
算法
2501_924879363 小时前
密集表盘漏检率↓79%!陌讯多模态融合算法在电表箱状态识别的边缘优化
人工智能·算法·计算机视觉·目标跟踪·智慧城市