• leetcode刷题笔记一百三十九题与一百四十题 单词拆分与单词拆分II


    leetcode刷题笔记一百三十九题与一百四十题 单词拆分与单词拆分II

    源地址:

    139. 单词拆分

    140. 单词拆分 II

    问题描述:

    139题问题描述

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

    说明:

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

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

    输入: s = "applepenapple", wordDict = ["apple", "pen"]
    输出: true
    解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
    注意你可以重复使用字典中的单词。
    示例 3:

    输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
    输出: false

    140题问题描述

    定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。

    说明:

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

    输入:
    s = "catsanddog"
    wordDict = ["cat", "cats", "and", "sand", "dog"]
    输出:
    [
    "cats and dog",
    "cat sand dog"
    ]
    示例 2:

    输入:
    s = "pineapplepenapple"
    wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
    输出:
    [
    "pine apple pen apple",
    "pineapple pen apple",
    "pine applepen apple"
    ]
    解释: 注意你可以重复使用字典中的单词。
    示例 3:

    输入:
    s = "catsandog"
    wordDict = ["cats", "dog", "sand", "and", "cat"]
    输出:[]

    //139题
    //139题使用动态规划的思想 以当前位置i做切割,若之前的字符串符合要求即dp(i) = true, 判断之后的字符串是否符合要求更新
    //初始状态方程:dp(0) = true
    //dp(i) == dp(j) && checkBool(s.substring(j,i))
    object Solution {
        def wordBreak(s: String, wordDict: List[String]): Boolean = {
            val dp = Array.fill(s.length+1)(false)
            dp(0) = true
    
            for (i <- 1 to s.length){
                for(j <- 0 to i){
                    if (dp(j) == true && wordDict.contains(s.substring(j, i)))
                    dp(i) = true
                }
            }
            return dp(s.length)
        }
    }
    
    //140题
    //本题使用了递归的想法,当判断前串符合要求,继而判断右侧串是否符合要求,若右侧符合则添加
    import scala.collection.mutable
    object Solution {
        def wordBreak(s: String, wordDict: List[String]): List[String] = {
            val cache = mutable.HashMap[Int, List[String]]()
            val dict = wordDict.toSet
            
            cache.put(s.length, List(" "))
            
            def rec(start: Int): List[String] = {
                if (cache.contains(start))  return cache(start)
                else {
                    val list = mutable.ListBuffer[String]()
                    for (i <- start+1 to s.length){
                        val left = s.substring(start, i)
                        if (dict.contains(left)){
                            val right = rec(i)
                            list ++= right.map(x => s"$left $x".trim)
                        }
                    }
                    cache.put(start, list.toList)
                    list.toList
                }
            }
            return rec(0)
        }
    }
    
  • 相关阅读:
    openVolumeMesh example 程序学习
    使用字符串创建java 对象
    HDU-1501-Zipper
    UVA-10285-Longest Run on a Snowboard
    HDU-2182-Frog
    HDU-2044-一只小蜜蜂
    POJ-1163-The Triangle
    HDU-1159-Common Subsequence
    HDU-2069-Coin Change
    HDU-4864-Task
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13543839.html
Copyright © 2020-2023  润新知