深信服2019春招笔试---子串模糊匹配

这是一道关于深信服2019年春季招聘笔试的题目,涉及字符串处理中的子串模糊匹配问题。题目要求从给定的字符串string开始,寻找能完整匹配的子串sub,其中sub中的'?'可以匹配一到三个非''字符。如果存在多种匹配方式,选择匹配字符数最少的一种。若无法完成匹配,返回-1。文章通过多个示例解释了输入和输出的格式及预期结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从字符串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
# 思路:
# 采用正则表达式做。
# 0、先考虑题目的要求两个字符串的长度不能超出范围,否则返回-1。
# 1、用“(.*?)”替换待匹配的短字符串中的“?”,然后编译生成一个正则表达式对象;
# 2、用生成的正则表达式对象去匹配长字符串,得到匹配结果result;
# 3、如果result不等于None则调用分组函数group()一个个遍历表示“?”的分组“(.*?)”的匹配长度是否满足要求,
# 只要有一个不满足就返回-1
# 都满足就返回result的长度
# 4、如果3没有返回则返回-1。
import re
class Solution():
    def return_re_length(self, first_str, second_str):
        if len(first_str) > 10000 or len(second_str) > 100:
            return -1
        second_str_re = second_str.replace("?","(.*?)")
        t=second_str.replace("?","")
        print('t:',t)
        number_wenhao = len(second_str) - len(second_str.replace("?",""))
        print('num:',number_wenhao)
        try:
            pattern = re.compile(r'{}'.format(second_str_re))
            res = pattern.match(first_str)
            print('res.group(1)',res.group(1))
            print('res.group(2)',res.group(2))
            for i in range(1,number_wenhao+1):
                if len(res.group(i)) == 0 or len(res.group(i)) > 3:
                    return -1
            return len(res.group(0))
        except:
            return -1
        # if res != None:
        #     for i in range(1,number_wenhao+1):
        #         if len(res.group(i)) == 0 or len(res.group(i)) > 3:
        #             return -1
        #     return len(res.group(0))
        # return -1
s1 = input()
s2 = input()
test = Solution()
print(test.return_re_length(s1, s2))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值