1014 第 1 场算法双周赛 契合匹配【算法赛】
时间:2023.11.3
题目地址:契合匹配【算法赛】
题目分析
首先就是要确定是要用到了kmp算法不会的去学一下,然后就会很清楚了 。
然后就是要移位那我们可以巧妙的将字符串
s
∗
2
s *2
s∗2 就可以解决移位的问题。
然后就是构造一个
s
+
s+
s+‘#’
+
t
+t
+t的字符串来构造前缀表,构造完后就简单了,从’#‘后开始判断就行了,找到当前的位数i.
i
−
2
∗
l
e
n
(
s
)
i-2*len(s)
i−2∗len(s),为顺时针的移位数;
a
b
s
(
i
−
3
∗
l
e
n
(
s
)
)
abs(i-3*len(s))
abs(i−3∗len(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")