动态规划139. 单词拆分

前言

之前入门算法用代码随想录(代码随想录),将递归,动态规划这些都学了一遍,也自己动手实现过,但之前也是边参考边写出来的,而且隔了有一段时间了,最近二刷一次!!这次挑战尽量自己写出来。

代码

public class _18_139_单词拆分 {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("leet");
        strings.add("code");

        System.out.println(wordBreak("leetcode", strings));
    }

    /**
     * 题目
     *
     * 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
     *
     * 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
     *
     * 问题转换:
     * s是背包,装Dict中的单词,只是这个weight需要去转换一下,几个单词就几个weight,并且能不能装下去,也需要一些列的判断
     *
     * 递推公式: [j,i]之间的单词在字典中,并且dp[j] =true ,那么dp[i] = true
     *
     * 关键词:[“完全背包”,“排列”]
     */
    public static boolean wordBreak(String s, List<String> wordDict) {
        //dp: 使用Dict中的单词,能不能组成0-i长度的前缀的s(String)
        boolean[] dp = new boolean[s.length()+ 1];

        //初始化:默认都不可以转换过来,但由于需要一个true转换过来,所以dp[0] = true
        dp[0] = true;

        //遍历顺序
        for(int j = 1; j <= s.length(); j++){
            for(String string : wordDict){
                int len = string.length();
                if(j >= len && dp[j-len] && string.equals(s.substring(j-len,j))){
                    dp[j] = true;
                    break;
                }
            }
        }
        return dp[s.length()];
    }
}

难点

这道题是没有靠自己做出来的,虽然看一下题解就写出来了,后面写完再刷一次,然后再之后重刷回溯算法的时候,记得将回溯的做法也写一下

体会

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值