单词拆分

一、题目描述

题目链接:https://leetcode-cn.com/problems/word-break/

单词拆分_第1张图片

 

二、题目分析

题解:https://leetcode-cn.com/problems/word-break/solution/dan-ci-chai-fen-by-leetcode-solution/

这道题使用的是类似前缀和的思路解决,我们想找出s的是否能切割出一些子串,这些子串全都是在wordDict中,判断在wordDict中其实比较好写,因为String是不可变的,所以只要字面值一样,我们调用contains方法就可以判断是否在wordDict中,我们需要做的是列举所有子串,这就可以想到前缀和的思路,因为前缀和也是列举所有的子数组嘛,只是我们不是求和,而是从其中拿一个SubString。

我们可以使用一个布尔类型的dp[i]来记录前(0,i)的子串是否能拆分成wordDict中的单词,那么假设我们现在取的字符长度为5(因为dp,所以我们已经有了dp在0到4的值),我们需要做的就是判断5这个位置的char,能不能和连在它前面的若干个字符组成在wordDict中的单词,这样子我们就列举一下就好了嘛,用一个j来列举,j要在i前面,代表subString(j+1,i),如果这个subString判断在wordDict中了,我们还需要判断j前面的是否也可以满足题目的要求,这就用dp[j]进行判断就可以了。

具体细节可以看代码。

 

三、代码

    public boolean wordBreak(String s, List wordDict) {
        Set wordSet = new HashSet<>(wordDict);
        int len = s.length();
        boolean[] dp = new boolean[len+1];
        dp[0] = true;
        for (int i = 1; i <= len; ++i) {
            // 注意这里的substring,因为i和j都是比真实下标大1的
            // 所以其实是j+1-1,i-1+1
            for (int j = 0; j < i; ++j) {
                if (dp[j] && wordSet.contains(s.substring(j,i))) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[len];
    }

 

你可能感兴趣的:(单词拆分)