leetcode单词拆分-Golang

博客内容讲述了如何使用动态规划方法解决字符串s根据给定的单词字典wordDict进行拆分的问题。代码示例展示了两种不同的实现方式,一种是暴力求解,另一种是采用动态规划优化。动态规划方案中,定义了dp数组来存储s中前i个字符是否能被字典中的单词拼接,通过遍历和回溯找到可行的拆分路径。
摘要由CSDN通过智能技术生成
139. 单词拆分

用set记录wordDict中单词出现情况

  • 暴力不过,仔细分析发现其中确实存在重复的判断
func wordBreak(s string, wordDict []string) bool {
	set := make(map[string]bool)
	for i := 0; i < len(wordDict); i++ {
		set[wordDict[i]] = true
	}
	return help(s, set, 0)
}

func help(s string, set map[string]bool, index int) bool {
	if index == len(s) {
		return true
	}
	for i := index + 1; i <= len(s); i++ {
		if set[s[index:i]] {
			if help(s, set, i) {
				return true
			}
		}
	}
	return false
}
  • 动态规划

明确dp数组的含义:

​ dp[i]表示s中前i个字符组成的序列是否可以由wordDict拼接成

确定递推公式:

​ 若考察的序列就在set中,dp[i]= true;

​ 否则,往前边找是否可以拼接成该序列

func wordBreak(s string, wordDict []string) bool {
    set := make(map[string]bool)
    for i := 0; i < len(wordDict); i++ {
        set[wordDict[i]] = true
    }
    n := len(s)
    dp := make([]bool, n)
    for i := 0; i < n; i++ {
        if set[s[:i+1]] {
            dp[i] = true
        } else {
            for j := 0; j < i; j++ {
                if dp[j] && set[s[j+1:i+1]] {
                    dp[i] = true
                }
            }
        }
    }
    return dp[n-1]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值