首页 > 试题广场 >

子串模糊匹配

[编程题]子串模糊匹配
  • 热度指数:3516 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
从字符串string开始完整匹配子串sub,返回匹配到的字符个数。

sub中如果出现'?'表示可以匹配一到三个除'\0'以外的任意字符。
如果sub还有找不到匹配的字符,则说明不能完整匹配。

如果能完整匹配,返回匹配到的字符个数,如果有多种匹配方式,返回匹配字符数最少的那个,如果不能完整匹配,返回-1


输入描述:
第一行输入字符串string,长度小于10000

第二行输入子串sub,长度小于100


输出描述:
从string开头位置完整匹配sub,匹配到的字符个数。
示例1

输入

abcdefg
a?c

输出

3
示例2

输入

aabcddefg
a?c

输出

4
示例3

输入

aabcddefg
b?e

输出

-1
示例4

输入

aabcddefg
a?d

输出

5
def check(list1, str1):
    for ll in list1:
        if ll not in str1:
            return -1
    if str1.find(list1[0]) != 0:
        return -1
    return 1


def func(str1, substr):
    locate = []
    res = []
    if substr in str1:
        print(len(substr))
    if '?' in substr:
        count1 = substr.count('?')
        list1 = substr.split('?', count1)
        #print(list1)
        if check(list1, str1) == -1:
            return -1
        for i in range(len(list1)):
            locate.append(str1.find(list1[i]))
            i += str1.find(list1[i])
        #print(locate)
        for j in range(1, len(locate)):
            res.append(locate[j] - (locate[j - 1] + len(list1[j - 1]) - 1))
        #print(res)
        for rr in res:
            if rr > 4:
                return -1
        return locate[-1] + len(list1[-1]) - locate[0]
    else:
        return -1


str1 = input()
substr = input()
print(func(str1, substr))
用‘?’做分隔符,拆分sub序列,之后算各个拆分序列之间的距离,若都不大于四,返回sub的首尾距离,若有大于四的,返回-1。

发表于 2020-08-25 10:16:41 回复(0)
import re
 
def maxProfit(string, sub):
    tmp_sub = "^" + sub.replace("?", "[\s|\S]{1,3}?")
    ls = re.findall(tmp_sub, string)
    min_len = len(string)
    if len(ls):
        for i in ls:
            min_len = min(min_len, len(i))
        return min_len
    return -1
 
 
_string = str(input())
_sub = str(input())
res = maxProfit(_string, _sub)
print(str(res))
利用python自带re模块进行匹配并获取最小长度
发表于 2019-09-18 01:58:50 回复(0)
def help(s,re):
    if re[0]!="?" and re[0]!=s[0]:
        return -1
    i = j = 0
    while i < len(re) and j < len(s):
        if re[i]==s[j]:
            i+=1
            j+=1
            continue
        if re[i] !="?" and re[i]!=s[j]:
            return -1
        if re[i]=="?":
            i+=1
            j+=1
            temp = j
            for k in range(0,3):
                if j+k<len(s) and re[i] == s[j+k]:
                    i+=1
                    j+=k
                    j+=1
                    break
            if j == temp:
                return -1
        else:
            j+=1
    if i == len(re):
        return j
    else:
        return -1
if __name__ == "__main__":
    s = input()
    re = input()
    print(help(s,re))

发表于 2019-09-11 17:27:30 回复(0)