zoukankan      html  css  js  c++  java
  • 140. Word Break II

    package LeetCode_140
    
    /**
     * 140. Word Break II
     * https://leetcode.com/problems/word-break-ii/description/
     *
     * Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add spaces in s to construct a sentence where each word is a valid dictionary word.
     * Return all such possible sentences.
    
    Note:
    The same word in the dictionary may be reused multiple times in the segmentation.
    You may assume the dictionary does not contain duplicate words.
    
    Example 1:
    Input:
    s = "catsanddog"
    wordDict = ["cat", "cats", "and", "sand", "dog"]
    Output:
    [
    "cats and dog",
    "cat sand dog"
    ]
     * */
    class Solution {
        fun wordBreak(s: String, wordDict: List<String>): List<String> {
            //val map = HashMap<String, String>()
            val map2 = HashMap<String, ArrayList<String>>()
            val set = HashSet<String>()
            //val result = ArrayList<String>()
            for (word in wordDict) {
                set.add(word)
            }
            return dfs2(s,set,map2)
        }
    
        /**
         * solution 1: recursion
         * TLE
         * */
        private fun dfs(index: Int, s: String, path: String, set: HashSet<String>, map: HashMap<String, String>, result: ArrayList<String>) {
            if (index == s.length) {
                //println("add:$path")
                result.add(path)
                return
            }
            for (i in index until s.length) {
                val word = s.substring(index, i + 1)
                if (!set.contains(word)) {
                    continue
                }
                dfs(i + 1, s, path + word + " ", set, map, result)
            }
        }
    
        /**
         * solution 2: recursion + memorization (dp: Top-Down), Time complexity:O(2^n), Space complexity:O(n)
         * */
        private fun dfs2(s: String, set: HashSet<String>, map: HashMap<String, ArrayList<String>>):ArrayList<String>{
            if (map.contains(s)){
                return map.get(s)!!
            }
            val res = ArrayList<String>()
            if (set.contains(s)){
                res.add(s)
            }
            for (i in 1 until s.length) {
                //just like left word
                val word = s.substring(0,i)
                if (set.contains(word)){
                    //s.substring(i) just like right word
                    val list = dfs2(s.substring(i),set,map)
                    for (str in list){
                        res.add(word+" "+str)
                    }
                }
            }
            map.put(s,res)
            return res
        }
    }
  • 相关阅读:
    SQL Server(00):分析函数
    SQL Server(00):序列SEQUENCE
    .NET Standard 、.NET Core、 .NET Framework的区别
    电脑音频播放器 foobar2000
    JavaScript:highcharts图表
    SQL Server(00):带有OUTPUT的INSERT,DELETE,UPDATE
    [开发笔记]-js判断用户的浏览设备是移动设备还是PC
    [开发笔记]-获取天气数据接口
    [开发笔记]-控制Windows Service服务运行
    C#程序调用cmd执行命令
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13092084.html
Copyright © 2011-2022 走看看