408.有效单词缩写 Python指针思路分析与细节解析!
2021-07-15 本文已影响0人
清风Python
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
欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。
我的个人博客:https://qingfengpython.cn