LeetCode-单词拆分

2,217 阅读1分钟

算法记录

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()];
    }
}

总结

问题的抽象能力。