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];
    }
};
相关推荐
靠沿5 分钟前
贪心算法专题(二)
算法·贪心算法
猎头南楼41 分钟前
具身智能模型部署方向的能力要求与技术栈梳理
人工智能·深度学习·算法
啥都想学点的研究生2 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归
青少儿编程课堂2 小时前
树状数组精讲:逆序对计数与离散化(附双语言解法)
算法·树状数组·离散化·信息学奥赛·逆序对
血小板要健康2 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
三声三视3 小时前
Word 转 Markdown 报“保真率 98%“,可那张表散了
word·word转markdown·格式转换·开发者工具·tri-docx2md·结构保真
VALENIAN瓦伦尼安教学设备3 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法
小小晓.3 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
怕浪猫3 小时前
用了两年 AI 编程工具后,我重新理解了什么是「资深工程师」
算法·面试·架构
hetao17338374 小时前
2026-08-27~29 hetao1733837 的刷题记录
c++·算法