高频算法面试题(字符串) leetcode 139. 单词拆分

leetcode 139. 单词拆分

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

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

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
     注意你可以重复使用字典中的单词。
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

这道题,我们考虑用动态规划的做法。
我们每次考虑字符串从开始的当前索引位置是否可以被拆分。如果可以就记忆化方便下次使用。
走起:

func wordBreak(s string, wordDict []string) bool {
	//首先先把所有的单词存到Map中,利用hash的O(1)的查找时间复杂度
    m := make(map[string]bool, len(wordDict))
    for _, v:= range wordDict {
        m[v] = true
    }
    //初始化dp数组
    dp := make([]bool, len(s)+1)
    dp[0] = true
    for i:=1;i<=len(s);i++ {
        for j:=0;j<i;j++ {
        //每次可以看前j个元素,和从j到i是否可以被拆分。
            if dp[j] && m[s[j:i]] {
            //dp数组中记忆化,方便下轮循环查看(这里的i表示是当前是第几个元素,并非是索引下标)
                dp[i] = true
                break
            }
        }
    }
    //返回dp数组最后一个元素就好
    return dp[len(s)]
}

动态规划是典型的纸老虎,看起来很唬人,但是它是吃草的哦。多玩玩就有感觉了。继续加油。

算法梦想家,来跟我一起玩算法,玩音乐,聊聊文学创作,咱们一起天马行空!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值