算法记录
LeetCode 题目:
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
说明
一、题目
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
二、分析
- 其实刚看到题目的时候脑袋里是没有解决方案的,我们再仔细的分析一下题目。
- 一个字符串需要拆分很多个连续的子字符串,然后我们需要在给出的数组中找到对应的字符串,因为不知道该怎么拆分字符串,所以无从下手。
- 我们不妨换个思路,将字符串拆成两部分,第一部分为已经找到了对应的可拆分的字符对应的,我们要在此基础上进行后面子字符串的拆分,那么切入点就来了,DP 问题。
- 从头到尾将字符串拆分为 (0, n)这样的子字符串,而这个子字符串可拆分的前提是存在一个位置 (0 < i < n)使得(0,i)、(i,n)在给定的数组中存在对应字符串,状态转移就是他们是否能够找到对应的字符串。
- 由于 i 的值我们不能直接进行判断,因此需要我们进行一次遍历去寻找,这样一来就是一个双重循环能解决问题。
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Set set = new HashSet(wordDict);
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++) {
dp[i] = dp[j] && set.contains(s.substring(j, i));
if(dp[i]) break;
}
}
return dp[s.length()];
}
}
总结
问题的抽象能力。