题目描述
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/word-break
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题
步骤1:定义状态
首先我们需要定义状态。在这个问题中,我们可以使用一个布尔数组dp[]来表示以i作为结尾的字符串是否可以拆分成字典中的词。
具体而言,如果dp[j-1]为真,且s.substring(j,i)在字典中出现,则dp[i-1]也为真。其中s.substring(j,i)表示从字符串s的第j个字符到第i-1个字符组成的子串。
步骤2:初始化状态
接下来,我们需要初始化状态。将dp[0]设置为true,因为长度为0的空字符串总是在字典中。
步骤3:状态转移
然后我们要进行状态转移。当我们正在计算dp[i-1]时,我们需要检查所有小于i的j,如果dp[j-1]为true并且s.substring(j,i)出现在字典中,则dp[i-1]为真。换句话说,i之前的某个位置j可以形成一个可拆分的子字符串,且剩余部分也可以拆分成字典中的单词。
步骤4:返回结果
最后,检查dp[n]是否为真,其中n表示字符串s的长度。如果dp[n]为真,则s可以被拆分成多个字典中的词。
下面是Java的代码实现:
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
int n = s.length();
boolean[] dp = new boolean[n+1];
dp[0] = true;
// 截取s中的字符串喝wordDict中的元素进行比对
for(int i = 1; i<n+1;i++){
for(int j = 0; j< i;j++){
String temp = s.substring(j,i);
boolean contain = wordDict.contains(temp);
if(contain && dp[j]){
dp[i] = true;
}
}
}
return dp[n];
}
}