面试题17.13恢复空白——力扣算法系列2020.07.09 python

第15天
2020.07.09 周四
难度系数:中等
题目:面试题17.13恢复空白
哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。
注意:本题相对原题稍作改动,只需返回未识别的字符数

示例:
输入:
dictionary = ["looked","just","like","her","brother"]
sentence = "jesslookedjustliketimherbrother"
输出: 7
解释: 断句后为"jess looked just like tim her brother",共7个未识别字符。

提示:
0 <= len(sentence) <= 1000
dictionary中总字符数不超过 150000。
你可以认为dictionary和sentence中只包含小写字母。
——————————我是分割线——————————
解法:
思路:动态规划
状态定义:dp[i]前i个字符所有可能的划分方式中,最少的未识别字符数。
状态转移:
1.第i个字符无法与前面任一子串组成单词。则第i个字符将作为一个未识别字符。dp[i]=dp[i-1]+1
2.第i个字符可与前面某个子串组成单词。假设该子串为sentence[j:i],且据题意sentence[j:i]要在dictionary中才算匹配。要找到j的值就要从0遍历到i-1,这里有j的两种特殊情况:
(1)j=0。表示新加入的第i个字符和前面所有的字符组成了一个单词。
(2)j=i-1。表示第i个字符构成单字母单词。
sentence[j:i]可构成单词 -> 它对未识别字符数没有任何贡献作用 -> 只需要考虑[:j]这部分子串的最少未识别字符数 -> dp[j]
故,情况2时,dp[i] = dp[j]其中0<=j<=i-1。

例如:
abcd四个字符,现在新加入一个字符e
情况1 字典中无以e结尾的单词,则未识别字符数f[5]=f[4]+1
情况2 字典中有以e结尾的单词,则找j需要从0遍历到4。
①j=0 [abcde] 如果字典中有单词abcde,则f[5]=f[0]
②j=1 a[bcde] 如果字典中有单词bcde,则f[5]=f[1]
③j=2 ab[cde] 如果字典中有单词cde,则f[5]=f[2]
④j=3 abc[de] 如果字典中有单词de,则f[5]=f[3]
⑤j=4 abcd[e] 如果字典中有单词e,则f[5]=f[4]

代码:

# leetcode面试题17.11恢复空格 2020.07.10
class Solution(object):
    def respace(self, dictionary, sentence):
        """
        :type dictionary: List[str]
        :type sentence: str
        :rtype: int
        """
        dic = {}.fromkeys(dictionary) #没有这句会超时的!
        lens = len(sentence) #句子长度
        dp = [0]*(lens+1) #为dp分配空间

        for i in range(1,lens+1):
            dp[i] = dp[i-1] + 1 #默认未匹配
            for j in range(0,i): #遍历从下标为0到下标为i-1
                if sentence[j:i] in dic: #如果下标j到下标i的单词在字典里则取dp最小
                    dp[i] = min(dp[i],dp[j])
        return dp[-1] #返回最后一个

dictionary = ["looked","just","like","her","brother"]
sentence = "jesslookedjustliketimherbrother"
print(Solution().respace(dictionary,sentence))
#结果7

面试题17.13恢复空白——力扣算法系列2020.07.09 python_第1张图片
——————————我是分割线——————————
补充知识:fromkeys()函数
这里主要体现该函数的提速作用。

你可能感兴趣的:(面试题17.13恢复空白——力扣算法系列2020.07.09 python)