为了更好的阅读体检,可以查看我的算法学习网
在线评测链接:P1446
题目内容
塔子哥有一个长度为 n n n的字符串,他想把这个字符串转换为回文串。塔子哥有两种魔法,使用一次魔法需要花费 1 法力值。
第一种魔法可以拿出字符串的第一个字母,并将其插在字符串的末尾。例如,对于字符串 a b b c abbc abbc ,通过第一种魔法后后变成了 b b c a bbca bbca
第二种魔法是将字符串中的一个字符变成任意小写字母。
塔子哥现在问你,需要至少多少法力值才能将这个字符串转换为回文串。
输入描述
第一行,一个正整数 n n n,代表字符串的长度
第二行,一个长度为 n n n的仅包含小写字母的字符串。
1 ≤ n ≤ 1 0 3 1 \leq n \leq 10^3 1≤n≤103
输出描述
一个整数,表示使得字符串变成回文串的最小法力值。
样例
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5
kkhbc
输出
2
说明
先试用一次魔法一,字符串变为 k h b c k khbck khbck。
再使用一次魔法二,字符串变为 k c b c k kcbck kcbck
思路:枚举
考虑旋转和修改的关系。
修改完再旋转,很大程度上会将已经修改完的部分变成无用功。
因为修改完,再旋转,会将已经匹配成功的部分会因为一次旋转而不再匹配。
所以我们考虑先旋转,再修改。
即枚举旋转次数,然后考虑修改。
时间复杂度: O ( n 2 ) O(n^2) O(n2)
代码
def op1():
res = 0
l, r = 0, len(s) - 1
while l < r:
if s[l] != s[r]:
res += 1
l += 1
r -= 1
return res
def op2():
t = s[1:] + s[0]
return t
n = int(input())
s = input()
ans = op1()
for i in range(n):
ans = min(ans, op1() + i)
s = op2()
print(ans)