动态规划例题

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

赋上一篇超级详细的知乎问答: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];
    }
}

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

点赞