139. 单词拆分

题目链接

https://leetcode.cn/problems/word-break/

思路

动态规划算法,dp[i]表示s前i个字符能否拆分 转移方程:dp[j] = dp[i] && check(s[i+1, j])
check(s[i+1, j])就是判断s[i+1, j]是否是wordDict中的元素
这个举个例子就很容易理解
假如wordDict=[“apple”, “pen”, “code”],s = “applepencode”; dp[8] = dp[5] + check(“pen”)
翻译一下:前八位能否拆分取决于前五位能否拆分,加上五到八位是否属于字典 (注意:i的顺序是从j-1 -> 0)

代码

class Solution {
    /*
        动态规划算法,dp[i]表示s前i个字符能否拆分
        转移方程:dp[j] = dp[i] && check(s[i+1, j]);
        check(s[i+1, j])就是判断s[i+1, j]是否是wordDict中的元素
        这个举个例子就很容易理解。
        假如wordDict=["apple", "pen", "code"],s = "applepencode";
        dp[8] = dp[5] + check("pen")
        翻译一下:前八位能否拆分取决于前五位能否拆分,加上五到八位是否属于字典
        (注意:i的顺序是从j-1 -> 0)
    */

    public HashMap<String, Boolean> hash = new HashMap<>();
    public boolean wordBreak(String s, List<String> wordDict) {
        boolean[] dp = new boolean[s.length()+1];
        
        //方便check,构建一个哈希表
        for(String word : wordDict){
            hash.put(word, true);
        }

        //初始化
        dp[0] = true;

        //遍历
        for(int j = 1; j <= s.length(); j++){
            for(int i = j-1; i >= 0; i--){
                dp[j] = dp[i] && check(s.substring(i, j));
                if(dp[j]) break;
            }
        }

        return dp[s.length()];
    }

    public boolean check(String s){
        return hash.getOrDefault(s, false);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间邮递员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值