当前位置: 首页 > news >正文

解决leetcode第3455题最短匹配子字符串

3455.最短匹配子字符串

难度:困难

问题描述

给你一个字符串s和一个模式字符串p,其中p恰好包含两个'*'字符。

p中的'*'匹配零个或多个字符的任何序列。

返回s中与p匹配的最短子字符串的长度。如果没有这样的子字符串,返回-1。

子字符串是字符串中的一个连续字符序列(空子字符串也被认为是合法字符串)。

示例1:

输入:s="abaacbaecebce",p="ba*c*ce"

输出:8

解释:

在s中,p的最短匹配子字符串是"baecebce"。

示例2:

输入:s="baccbaadbc",p="cc*baa*adb"

输出:-1

解释:

在s中没有匹配的子字符串。

示例3:

输入:s="a",p="**"

输出:0

解释:

空子字符串是最短的匹配子字符串。

示例4:

输入:s="madlogic",p="*adlogi*"

输出:6

解释:

在s中,p的最短匹配子字符串是"adlogi"。

提示:

1<=s.length<=105

2<=p.length<=105

s仅包含小写英文字母。

p仅包含小写英文字母,并且恰好包含两个'*'。

问题分析:

思路是将模式字符串p中除*号之外的字符串提取出来,然后在字符串s中去匹配

我们将按left*mid*right的模式提取出三部分left、mid和right,将它们各自在原字符串s中的索引号找到,并以[left,索引号]、[mid,索引号]和[right),索引号]的形式记录在列表中。最后我们再在这个列表中去找长度最短的匹配字符串长度。

根据提取出的left、mid和right的不同,有不同的处理:

如果p=**,直接返回0

如果p=**right或*mid*或left**,直接返回提取出来的字符串right、mid或left的长度

如果p=*mid*right、left**right或left*mid*,则直接找与mid*right、left**right和left*mid的最短长度就可以了

最后是p=left*mid*right这种形式,其实也是返回left*right的最短长度,只不过在它们中间一定要有mid的位置,且不能有重叠区间

程序如下:

#从字符串s中找字符串t的索引位置并返回列表
def get_str_index(s,t):
    n=s.count(t)
    d=[]
    m=0
    for i in range(n):
        m=s.index(t,m)
        d.append(m)
        m=m+1
    return d

#将按p拆分的几部分分别在s中查找对应的索引,并以列表的形式返回
def get_lmr_list(s,p):
    a=p.split('*')
    b=[]
    for i in a:
        c=get_str_index(s,i)
        d=[[i,k] for k in c]
        b.extend(d)
    return b

#将按p生成的几部分的索引列表,对输入的两部分求取其中的最短范围,并返回
def get_min_dis(a_list,lmr1,lmr2,lmr3):
    lmr1_list=[i for i in a_list if i[0]==lmr1]
    lmr2_list=[i for i in a_list if i[0]==lmr2]
    if lmr3!='':
        lmr3_list=[i for i in a_list if i[0]==lmr3]
    min_dis=max(k[1] for k in a_list)
    a=[]
    b=[]
    for i in lmr1_list:
        for j in lmr2_list:
            if j[1]>i[1]+len(lmr1) and True if lmr3=='' else check_mid_in(i[1]+len(lmr1)-1,j[1],lmr3_list):
                dis=j[1]-i[1]+len(lmr2)
                if dis<min_dis:
                    min_dis=dis
                    a=i
                    b=j
    # print([a,b])
    return [a,b]

def check_mid_in(a,b,c):
    for i in c:
        if a<i[1] and i[1]+len(i[0])-1<b:
            return True
    else:
        return False

#获取最短匹配子字符串长度
def get_min_str(s,p):
    temp=get_lmr_list(s,p)
    a=p.split('*')
    left=a[0]
    mid=a[1]
    right=a[2]
    if left=='' and mid=='' and right=='':
        return 0
    elif left=='' and mid=='' and right in s:
        return len(right)
    elif mid=='' and right=='' and left in s:
        return len(left)
    elif left=='' and right=='' and mid in s:
        return len(mid)
    elif left=='' and mid in s and right in s:
        a=get_min_dis(temp,mid,right,left)
        return a[1][1]+len(a[1][0])-a[0][1]
    elif mid=='' and left in s and right in s:
        a = get_min_dis(temp, left, right,mid)
        return a[1][1]+len(a[1][0])-a[0][1]
    elif right=='' and left in s and mid in s:
        a = get_min_dis(temp, left, mid,right)
        return a[1][1]+len(a[1][0])-a[0][1]
    elif left in s and mid in s and right in s:
        a = get_min_dis(temp, left, right,mid)
        if not a[0] and not a[1]:
            return -1
        else:
            return a[1][1]+len(a[1][0])-a[0][1]

s=input('pls input s=')
p=input('pls input p=')
print(get_min_str(s,p))

运行实例一

pls input s=abaacbaecebce

pls input p=ba*c*ce

8

运行实例二

pls input s=abc

pls input p=**

0

运行实例三

pls input s=abcbabdcad

pls input p=ab**d

6

运行实例四

pls input s=abcbabdcad

pls input p=ab*ca*dc

-1

问题来了,慢慢思考,慢慢改进方法,不沮丧,不气馁,人生也一样,很多时候是慢慢而艰难地磨过来的。

相关文章:

  • ui要放在析构函数里吗?
  • Java-ArrayList
  • css基本功
  • 【Troubleshot】Qt 长按按键 keyPressEvent keyReleaseEvent 自动重复问题
  • 【从零开始学习计算机科学】数据库系统(六)DBMS事务管理
  • C# 发送邮件 报错:此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。
  • 【学习笔记】语言模型的发展历程
  • SpringBoot3+Lombok如何配置logback输出日志到文件
  • JVM 垃圾回收器的选择
  • 80.Dictionary 字典 C#例子
  • 【MySQL 中 `TINYINT` 类型与布尔值的关系】
  • 【Java基础】Java 的内部类
  • 22. dirmap:高级 Web 目录与文件扫描工具
  • 西门子S7-1200 PLC远程调试技术方案(巨控GRM532模块)
  • nginx学习,URI,try_files
  • Mysql表的查询
  • 提升 React 应用性能:使用 React Profiler 进行性能调优
  • 【redis】lua脚本
  • JConsole 在 Linux 上的使用
  • [CISSP] [1] 访问控制//入侵检测与网络防护
  • a站下载安装/seo没什么作用了
  • wordpress 上传网站/seo月薪
  • 网络推广网站/百度400电话
  • 美团外卖网站开发/seo技术团队
  • 做网站项目流程/广东seo网络培训
  • 哪个网站可以做计算机二级的题/正规网络公司关键词排名优化