题目
思路分析
这里又要用到动态规划的知识
1.定义dp[i]为sentence[:i]在字典中未识别的字符数,长度为sentence的长度+1
2.判断sentence[j:i] (i>j>=0)是否在字典中,若不在,则dp[i] = dp[i-1]+1
3.若在,则dp[i] = min(dp[i], dp[j])
这和当前子串是否在给定串中以及计算子串出现次数有异曲同工之妙
代码
func respace(dictionary []string, sentence string) int {
dic := make(map[string]bool, len(dictionary))
// dp[i]代表sentence[:i]中未识别的字符数,用map类型更加方便查找
for _, v := range dictionary {
dic[v] = true //循环遍历输入的字典
}
dp := make([]int, len(sentence)+1)// 定义dp[i]为sentence[:i]在字典中未识别的单词
for i := 1; i <= len(sentence); i++ {
dp[i] = dp[i-1] + 1 //先假定新加这个字符之后没有匹配到任何单词
for j := 0; j < i; j++ {
if dic[sentence[j:i]] && dp[j] < dp[i] {
dp[i] = dp[j]
//遍历从j到i,不包括索引i组成的子字符串是否能匹配上字典里的单词,
}
}
}
return dp[len(sentence)] //返回未识别的字符数
}
示例