408.有效单词缩写
难度:简单
题目
给一个 非空 字符串 s 和一个单词缩写 abbr ,判断这个缩写是否可以是给定单词的缩写。
字符串 "word" 的所有有效缩写为:
["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", "1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"]
注意单词 "word" 的所有有效缩写仅包含以上这些。任何其他的字符串都不是 "word" 的有效缩写。
注意:
假设字符串 s 仅包含小写字母且 abbr 只包含小写字母和数字。
示例
示例 1: 给定 s = "internationalization", abbr = "i12iz4n": 函数返回 true. 示例 2: 给定 s = "apple", abbr = "a2e": 函数返回 false.
分析
word中举了那么多例子,其实总结起来就是,数字可以代表任何一个字母。
有多少数字,我们就可以跳过多少个字母不做检测。
然后这道题就很简单了?不,只能说这道题细节太多了...
- abbr中的数字是否会超过word总长度?
- abbr中的数字出现在最后,导致右边界匹配不全?
- 数字以0开头,需要判断为不合规的匹配类型?
- 数字可能不仅仅想示例中是1位,多位又该如何计算?
思路:
- 对于数字,尤其多位数字我们需要维护一个临时的num用于记录。
- 当出现多位数字时,使用
num = num * 10 + int(i)
的方式追加。 - 每次在指针追加num后,都需要判断指针是否以超过word总长
- 对于数字出现在最后的问题,需要在末尾添加point+num的操作后再进行判断
具体解题如下:
解题
class Solution: def validWordAbbreviation(self, word: str, abbr: str) -> bool: point, num, lg = 0, 0, len(word) for i in abbr: if i.isdigit(): if num == 0 and i == '0': return False num = num * 10 + int(i) continue if num: point += num num = 0 if point >= lg or word[point] != i: return False point += 1 return True if point + num == lg else False