• 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);
            }
        }
    }

    希望与大家多多交流。

  • 相关阅读:
    Unity 预处理命令
    Unity 2DSprite
    Unity 生命周期
    Unity 调用android插件
    Unity 关于属性的get/set
    代码的总体控制开关
    程序员怎么问问题?
    VCGLIB 的使用
    cuda实践(1)
    python之json文件解析
  • 原文地址:https://www.cnblogs.com/llguanli/p/8555781.html
Copyright © 2020-2023  润新知