一、写在前面的废话
最近看到了“动态规划”的思想(我觉得他是一种思考问题的思想),之前没怎么接触过,仅限于知道这个词,这次打算了解一下,网上有很多讲解,讲的很细,但是不实际动手也不知道是怎么回事,今天就记录一下碰到的题目,帮助自己理解吧
赋上一篇超级详细的知乎问答: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];
}
}
先记录到这,后面得好好理解一下这个思想