欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-01-01 12:52:16
题目描述 或 剑指offer19.正则表达式匹配在Linux Shell命令下通配符’‘表示0个或多个字符, 现编写一段代码实现通配符’‘的功能,注意只需要实现’*’, 不用实现其他通配符。数据读入:需要读入两行line,怎么做:遇到""空字符,break;空字符前(第一行)的赋值给t,之后的input()(第二行)赋值给s;while True: line = sys.stdin.readline().strip() if line == '': #一直读入,直到遇到空...

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

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

数据读入:

(难,未完)通配符或正则表达式:判断是否能匹配 == 剑指 Offer 19. 正则表达式匹配
需要读入两行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

上一篇:

下一篇: