蓝桥 1014 第 1 场算法双周赛 契合匹配【算法赛】python解析

1014 第 1 场算法双周赛 契合匹配【算法赛】

时间:2023.11.3
题目地址:契合匹配【算法赛】

题目分析

首先就是要确定是要用到了kmp算法不会的去学一下,然后就会很清楚了
然后就是要移位那我们可以巧妙的将字符串 s ∗ 2 s *2 s2 就可以解决移位的问题。
然后就是构造一个 s + s+ s+‘#’ + t +t +t的字符串来构造前缀表,构造完后就简单了,从’#‘后开始判断就行了,找到当前的位数i.
i − 2 ∗ l e n ( s ) i-2*len(s) i2len(s),为顺时针的移位数; a b s ( i − 3 ∗ l e n ( s ) ) abs(i-3*len(s)) abs(i3len(s)),为逆时针的移位数。
最主要还是了解kmp算法的字符串匹配的过程,其他的理清楚就行了。

代码

def get_next(s: str):
    n = len(s)
    nnext = [0]*n
    for i in range(1, n):
        j = nnext[i-1]
        while j > 0 and s[i] != s[j]:
            j = nnext[j-1]
        if s[i] == s[j]:
            j += 1
        nnext[i] = j
    return nnext

def find_occurrences(t, s): # t 代表文本,s 代表要找的字符串
    cur = s + '#' + t
    sz1, sz2 = len(t), len(s)
    lps = get_next(cur)
    for i in range(sz2 + 1, sz1 + sz2):
        if lps[i] == sz2:
            ans = min(i - 2 * sz2, abs(i - 3*sz2)) # 顺、逆时针,取最小
            return 1, ans
    return 0, 0

n = int(input())
s = input()
t = input()

s = s + s
s = s.swapcase()

label, res = find_occurrences(s, t)
if label:
    print('Yes')
    print(res)
else:
    print("No")
  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值