题目链接:拆分词句_牛客题霸_牛客网 (nowcoder.com)
自己做不出来,看了大佬的答案,浅分析了一下。
题目要求是一个字符串能否根据dict中的词分成一个或多个单词,那么它的子问题就是:前1、2、3......n个字符串能否根据dict中的词分成一个或多个单词。
动归五部曲
1.明确dp数组的定义及下标的含义
2.写出递推公式
3.dp数组初始化
4.确定遍历顺序
5.打印
1.dp[i]定义:前i个字符能否根据dict中的词被成功分词;
2.状态递推:true{j <i && F(j) && substr[j+1,i]能在词典中找到} OR false
在j小于i中,只要能找到一个F(j)为true,并且从j+1到i之间的字符能在词典中找到,则F(i)为true;
3.初始化:对于初始值无法确定的,可以引入一个不代表实际意义的空状态,作为状态的起始空状
态的值需要保证状态递推可以正确且顺利的进行。 dp[0]=true;
4.遍历顺序:从前到后。
代码如下:
import java.util.Set;
public class Solution {
public boolean wordBreak(String s, Set<String> dict) {
boolean[] dp = new boolean[s.length() + 1];
//初始化
dp[0] = true;
for (int i = 1; i <= s.length(); i++) {
for (int j = 0; j < i; j++) {
if (dp[j] && dict.contains(s.substring(j, i))) {
dp[i] = true;
break;
}
}
}
return dp[dp.length - 1];
}
}
详细分析:
第一次循环:
第二次:
第三次:
第四次:
第五次:
第六次:
第七次: