动态规划例题

一、写在前面的废话
最近看到了“动态规划”的思想(我觉得他是一种思考问题的思想),之前没怎么接触过,仅限于知道这个词,这次打算了解一下,网上有很多讲解,讲的很细,但是不实际动手也不知道是怎么回事,今天就记录一下碰到的题目,帮助自己理解吧

赋上一篇超级详细的知乎问答:https://www.zhihu.com/question/23995189

二、题目

给定一个字符串s和一个词dict的字典,确定s可以被分割成一个或多个词典单词的空格分隔的序列。
例如,给定 s =“leetcode”,dict = [“leet”,“code”]。
返回true,因为“leetcode”可以被分割为“leet code”。

(一开始不知道动态规划怎么用,写了好久,改了好久,也没把测试用例都跑通T T)

三、解答(讲解都写在注释里了)

import java.util.*;
public class Solution {
    public boolean wordBreak(String s, Set<String> dict) {
        if(s == null || dict.isEmpty()){
            return false;
        }
        /*
           * 状态转移方程:
           * f(i) 表示s[0,i-1]是否可以分词
           * f(i) = f(j) && f(j+1,i); 0 <= j < i;
           */
        int len = s.length();
        Boolean[] sp = new Boolean[len+1];//sp[i]表示s[0,i-1]是否可分,注意,子字符串是到下标i-1
        sp[0] = true;//sp[0]不包含任何子串,可以看做是空串
        for(int i = 1; i <= len; i++){//终止下标
            for(int j = 0; j < i; j++){//起始下标
                //s.substring(j,i):子字符串包含下标j,不包含下标i
                //s[0,j-1]可分 && dict里包含s[j,i-1] => s[0,i-1]可分,即sp[i]=true
                if(sp[j] && dict.contains(s.substring(j,i))){
                    sp[i] = true;
                    break;//只要能找到任意一种分法可以让s[0,i-1]可分就是满足题意的
                }else {
                    sp[i] = false;
                }
            }
        }
        return sp[len];
    }
}

先记录到这,后面得好好理解一下这个思想

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值