LeetCode_DP_Word Break II

LeetCode_Word Break II

一、题目描写叙述:

二、解决思路:

题目要求我们要在原字符串中加空格,使得隔开的每一个词都是词典中的词。

所以我们大能够按顺序扫描每一个字符。可是然后当碰到是词典中的词。就加个空格,可是要求返回的结果按题目的提醒是个List,说明有非常多分隔方式。

再细细想问题。我们发现第二个词能被成功分隔出来,是由于第一个词已经分出来了。依次类推;所以我们能够採用动态规划,设置初值dp[0] 是一个 List;递推式是 dp[n] = dp[n-1] && a[n] (a[n] = dict.contains(每次截断的字符串))。

这样,我们通过动态规划。就获得了字符串中每一个字符索引处的单词。

dp[10] = {“dog”}, dp[7]={“and”,”sand”}, dp[4]={“cats”}, dp[3]={“cat”}, dp[0]={},其它都是null。

最后我们要做的就是按顺序组合字符串,放到List中,返回。怎么组合呢?这就能够利用dfs递归。在我理解,能够把递归想象成一个栈。重要的是设置结束条件和在剔除栈顶元素。

三、Java代码:

public class Solution {
    public List<String> wordBreak(String s, Set<String> wordDict) {

        List<String>[] dp = new ArrayList[s.length()+1];
        dp[0] = new ArrayList<String>();//设置初值

        for(int end=1; end<=s.length(); end++) {//substring的endIndex
            for(int start=end-1; start>=0; start--) {
                String word = s.substring(start,end);
                if(dp[start] != null && wordDict.contains(word)) { //动态规划递推式
                    if(dp[end] == null) {
                        dp[end] = new ArrayList<String>();
                    }
                    dp[end].add(word);
                }
            }
        }

        List<String> result = new ArrayList<String>();
        if(dp[s.length()] == null)
            return result;
        else {
            List<String> temp = new ArrayList<String>();
            dsfStringList(dp,s.length(),result,temp);
            return result;
        }
    }

    private static void dsfStringList(List<String>[] dp, int end, List<String> res, List<String> temp) {
        if(end <= 0) { //递归结束条件
            String s = temp.get(temp.size()-1);
            for(int i = temp.size()-2; i >= 0; i--)
                s += (" "+temp.get(i));
            res.add(s);
            return;
        }

        for(String str : dp[end]) {
            temp.add(str);
            dsfStringList(dp, end-str.length(), res, temp); //递归式
            temp.remove(temp.size()-1);
        }
    }
}


希望与大家多多交流。

原文地址:https://www.cnblogs.com/llguanli/p/8555781.html

时间: 2024-11-05 21:02:28

LeetCode_DP_Word Break II的相关文章

[leecode]Word Break II

Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, givens = "catsanddog",dict = ["cat", &q

Word Break &amp;&amp; Word Break II

Word Break && Word Break II Word Break 题目: Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, given s = "leetcode", dict = ["

LeetCode_Word Break II

LeetCode_Word Break II 一.题目描述: 二.解决思路: 题目要求我们要在原字符串中加空格,使得隔开的每个词都是词典中的词. 所以我们大可以按顺序扫描每个字符,但是然后当碰到是词典中的词,就加个空格,但是要求返回的结果按题目的提醒是个List,说明有很多分隔方式. 再细细想问题,我们发现第二个词能被成功分隔出来,是因为第一个词已经分出来了,依次类推:所以我们可以采用动态规划,设置初值dp[0] 是一个 List:递推式是 dp[n] = dp[n-1] && a[n]

Leetcode dfs Word Break II

Word Break II Total Accepted: 15138 Total Submissions: 92228My Submissions Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For ex

【leetcode】Word Break II

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, givens = "catsanddog",dict = ["cat", "cats"

Word Break II leetcode java

题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, given s = "catsanddog", dict = ["cat", "cats

LeetCode: Word Break II [140]

[题目] Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, given s = "catsanddog", dict = ["cat", "cat

[leetcode]Word Break II @ Python

原题地址:https://oj.leetcode.com/problems/word-break-ii/ 题意: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, givens = "c

Word Break II 求把字符串拆分为字典里的单词的所有方案 @LeetCode

这道题类似  Word Break 判断是否能把字符串拆分为字典里的单词 @LeetCode 只不过要求计算的并不仅仅是是否能拆分,而是要求出所有的拆分方案.因此用递归. 但是直接递归做会超时,原因是LeetCode里有几个很长但是无法拆分的情况,所以就先跑一遍Word Break,先判断能否拆分,然后再进行拆分. 递归思路就是,逐一尝试字典里的每一个单词,看看哪一个单词和S的开头部分匹配,如果匹配则递归处理S的除了开头部分,直到S为空,说明可以匹配. public class Solution