leetcode 139.单词拆分

题目描述

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。leetcode 139.单词拆分_第1张图片

来源:力扣(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];
    }
}

leetcode 139.单词拆分_第2张图片

你可能感兴趣的:(leetcode,leetcode)