408.有效单词缩写 Python指针思路分析与细节解析!

408.有效单词缩写

https://leetcode-cn.com/problems/valid-word-abbreviation/solution/408you-xiao-dan-ci-suo-xie-pythonzhi-zhe-2tc7/

难度:简单

题目

给一个 非空 字符串 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中举了那么多例子,其实总结起来就是,数字可以代表任何一个字母。
有多少数字,我们就可以跳过多少个字母不做检测。
然后这道题就很简单了?不,只能说这道题细节太多了...

  1. abbr中的数字是否会超过word总长度?
  2. abbr中的数字出现在最后,导致右边界匹配不全?
  3. 数字以0开头,需要判断为不合规的匹配类型?
  4. 数字可能不仅仅想示例中是1位,多位又该如何计算?

思路:

  1. 对于数字,尤其多位数字我们需要维护一个临时的num用于记录。
  2. 当出现多位数字时,使用num = num * 10 + int(i)的方式追加。
  3. 每次在指针追加num后,都需要判断指针是否以超过word总长
  4. 对于数字出现在最后的问题,需要在末尾添加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

力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown

你可能感兴趣的:(算法之美,字符串,python,leetcode,java,算法)