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];
    }
};
相关推荐
AI科技星12 分钟前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿1 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨1 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
Hello eveybody1 小时前
介绍一下背包DP(Python)
开发语言·python·动态规划·dp·背包dp
晨曦夜月2 小时前
map与unordered_map区别
算法·哈希算法
图码2 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler012 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie12 小时前
实数列的常用递推模式
算法
代码小书生3 小时前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星3 小时前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算