52.正则表达式匹配

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。

思路:

这里s和pattern都不为空的情况比较好考虑,需要多注意s和pattern存在为空的情况~

  • 首先,存在一种情况,pattern的第一个字符不管是什么,第二个字符是*,这就代表着第一个字符可能存在0次,即 char*这个情况:
  • 假设s[0] != pattern[0], 那么我们可以把pattern后移两位继续判断,这就是让pattern第一个字符出现0次(这里pattern第一个字符不可以是'.')。比如s=jsffff, pattern=q*s.ss,j!=q,那么pattern后移两位,从s.ss开始判断;
  • 假设s[0] == pattern[0],并且pattern[1]是 *,这个时候又可以分成三种情况
  1. pattern不变,s后移一位,因为pattern中的*可以匹配多位;
  2. pattern后移2位,s不变,相当于把pattern前两位当成空,略过前两位;
  3. pattern后移2位,s后移1位,相当于pattern前2位与s[0]匹配。

当pattern第二个字符不为*的情况:

  • 如果s[0] == pattern[0]或者pattern[0] == '.',s和pattern都后移一位
  • 否则返回False

剩余的情况就是s或者pattern某个为空的时候

  • 假设s和pattern都为空,返回True;
  • 假设s不为空,pattern为空,返回False;
  • 假设s为空,pattern不为空,则需要判断: 如果pattern的第二个字符是*,pattern后移2位继续判断。否则返回False。
# -*- coding:utf-8 -*-
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        if len(s) == 0 and len(pattern) == 0:
            return True
        elif len(s) != 0 and len(pattern) == 0:
            return False
        elif len(s) == 0 and len(pattern) != 0:
            if len(pattern) > 1 and pattern[1] == '*':
                return self.match(s, pattern[2:])
            else:
                return False
        else:
            if len(pattern) > 1 and pattern[1] == '*':
                if s[0] != pattern[0] and pattern[0] != '.':
                    return self.match(s, pattern[2:])
                else:
                    return self.match(s, pattern[2:]) or self.match(s[1:], pattern[2:]) or self.match(s[1:], pattern)
            else:
                if s[0] == pattern[0] or pattern[0] == '.':
                    return self.match(s[1:], pattern[1:])
                else:
                    return False


python 中如何匹配. python如何匹配字符_python实现

已绕晕


53.表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

思路:

让我们开始仔细审题,看看给出的反例:

  • 12e:e的后面必须有数字;
  • 1a3.14:不能有除了e/E之外的其它字母;
  • 1.2.3:不能有多个小数点;
  • +-5:只能有1个符号位;
  • 12e+4.3:e后面不能有小数点;

这样如果用if else方式判断可能会比较多情况,可以考虑用正则表达式

re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式;
[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k';
re*匹配0个或多个的表达式;
[0-9]匹配任何数字。类似于 [0123456789];
re+匹配1个或多个的表达式。

class Solution:
    # s字符串
    def isNumeric(self, s):
        import re
        a = re.match(r"[+-]?[0-9]*(.[0-9]*)?([eE][+-]?[0-9]+)?", s)
        if a.group(0) == s:
            return True
        else:
            return False

group([group1, …])方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group()group(0)

python 中如何匹配. python如何匹配字符_python实现_02

都。。都是套路


54.字符流中第一个不重复的字符

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

输出描述:

如果当前字符流没有存在出现一次的字符,返回#字符。

思路:

由于字符属性,可以用一个长为256的数组巧妙地存储每个字符出现的位置。字符本身的ascii码当作数组index。初始化数组每个元素都为-1。

  • 假设这个字符是第一次出现,那么把-1替换成这个字符出现的index;
  • 假设这个字符不是第一次出现,即这个位置的值>0,那么把这个位置的值变成-2;

最后在该数组中找到>0的最小值,这个位置所代表的字符就是结果。

class Solution:
    # 返回对应char
    def __init__(self):
        self.list = [-1]*256 
        self.index = 0
    def FirstAppearingOnce(self):
        tmp_min = 1000
        index = -1
        for i in range(len(self.list)):
            if self.list[i] >= 0 and tmp_min > self.list[i]:
                index = i
                tmp_min = self.list[i]
        if index >= 0:
            return chr(index)
        else:
            return '#'
        
    def Insert(self, char):
        if self.list[ord(char)] == -1:
            self.list[ord(char)] = self.index
        elif self.list[ord(char)] == -2:
            pass
        else:
            self.list[ord(char)] = -2
        self.index += 1

python 中如何匹配. python如何匹配字符_python 全中文匹配字符_03

chr(x)就是由ASCII码转成字符,ord(x)就是由字符转ASCII码~

二 进 制


那么今天的更新就到这里啦~ 大家明天再会!