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]是 *,这个时候又可以分成三种情况
- pattern不变,s后移一位,因为pattern中的*可以匹配多位;
- pattern后移2位,s不变,相当于把pattern前两位当成空,略过前两位;
- 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
已绕晕
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)
都。。都是套路
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
chr(x)就是由ASCII码转成字符,ord(x)就是由字符转ASCII码~
二 进 制
那么今天的更新就到这里啦~ 大家明天再会!