单词拆分

192 阅读1分钟

题目

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"] 输出: true 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

动态规划

import java.util.ArrayList;
import java.util.List;

public class Main {


    public static void main(String[] args) {

        Main main = new Main();
        List<String> tt = new ArrayList<>();
        tt.add("leet");
        tt.add("code");
        main.wordBreak("leetcode", tt);

    }

    public boolean wordBreak(String s, List<String> wordDict) {
        if (wordDict.contains(s)) {
            return Boolean.TRUE;
        }
        boolean [] dp = new boolean[s.length()];
        for (int i = 0; i < s.length(); i ++) {
            for (int j = 0; j <= i; j ++) {
                String temp = s.substring(j , i + 1);
                if (wordDict.contains(temp) && (j - 1 < 0 || dp[j - 1])) {
                    dp[i] = Boolean.TRUE;
                    break;
                }
            }
        }
        return dp[s.length() - 1];

    }
}

基本思路

  1. 这道题目发现和最小拆分回文串2的思路一致, 找状态转移方程的时候, 需要枚举包含当前字符串的符合条件的字符串, 然后问题就变成了前面一个子问题. 即当计算dp[j]的时候, 枚举0...j, 1...j, 2...j等等哪些符合要求, 如果存在符合要求的k..j, 那么dp[j] = dp[k]

我们需要枚举 s[0..i-1]中的分割点 j ,看 s[0..j-1]组成的字符串 s_1和 s[j..i-1]组成的字符串 s_2是否都合法,如果两个字符串均合法,那么就合法