当前位置: 移动技术网 > IT编程>开发语言>正则 > (难,未完)通配符或正则表达式:判断是否能匹配 == 剑指 Offer 19. 正则表达式匹配

(难,未完)通配符或正则表达式:判断是否能匹配 == 剑指 Offer 19. 正则表达式匹配

2020年07月30日  | 移动技术网IT编程  | 我要评论
题目描述 或 剑指offer19.正则表达式匹配在Linux Shell命令下通配符’‘表示0个或多个字符, 现编写一段代码实现通配符’‘的功能,注意只需要实现’*’, 不用实现其他通配符。数据读入:需要读入两行line,怎么做:遇到""空字符,break;空字符前(第一行)的赋值给t,之后的input()(第二行)赋值给s;while True: line = sys.stdin.readline().strip() if line == '': #一直读入,直到遇到空

题目描述 或 剑指offer19.正则表达式匹配

Shopee2019年笔试题:在Linux Shell命令下通配符’‘表示0个或多个字符, 现编写一段代码实现通配符’‘的功能,注意只需要实现’*’, 不用实现其他通配符。

数据读入:

在这里插入图片描述
需要读入两行line,怎么做:
遇到""空字符,break;
空字符前(第一行)的赋值给t,之后的input()(第二行)赋值给s;

while True:
    line = sys.stdin.readline().strip()
    if line == '':    #一直读入,直到遇到空字符break
        break
    t = line        
    print('t:', t)    #o*m 为第一行输入
    s = input()     
    print('s:', s)    #shopeemobile.com

或者直接

t = input()
s = input()

代码 通配符/正则表达式

#深度优先遍历,动态规划,回溯算法
import sys
def DFS(i, j):
    if j == len(t):		#j到头了表示t匹配成功
        S.add(i)
        return
    if i == len(s):		#i==len(s)表明当前已经深度优先到最深了,源串已经匹配结束
        return
    if s[i] == t[j]:	#如果是字母本身匹配,看下一组是否匹配DFS(i+1, j+1)
        DFS(i+1, j+1)
    elif t[j] == '*':
        DFS(i, j+1)		#s不变,t往下,*代表0个
        DFS(i+1, j)		#s往下,t不变,*代表两个
        DFS(i+1, j+1)	#s往下,t不变,*代表1个
    return
while True:
    line = sys.stdin.readline().strip()
    if line == '':    #一直读入,直到遇到空字符break
        break
    t = line			#target目标串
    #print('t:', t)    #o*m 为第一行输入
    s = input()     	#SOURCE源串
    #print('s:', s)    #shopeemobile.com
    S = set()
    #print("S是:", S)    #set()
    flag = False
    # i is the start idx of s
    # S includes all the end index it that s[i:it] matches t
    for i in range(len(s)):
        if s[i] == t[0] or t[0] == '*':    #可以开始遍历的条件
            DFS(i, 0)        #s串从i开始,j串从0开始
        if len(S) != 0:
            flag = True		#当S有值时,flag为True
            for it in sorted(S):	#sorted(S)不改变S,按从小到大顺序重排令赋值
                if it > i:			#S中存储的it是s串中当前i开头,匹配成功的尾巴在s中的index
                    print(i, it-i)	#对S进行sorted排序后(从小到大),i=2时候,[7,16],所以返回(2,5)和(2,14)
        S.clear()
    if not flag:		#如果flag为false,直接返回(-1,0)
        print(-1, 0)

本文地址:https://blog.csdn.net/qq_36045062/article/details/107647347

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网