【备战秋招】每日一题:2023.08.12-京东机试-第一题-回文字符串

为了更好的阅读体检,可以查看我的算法学习网
在线评测链接: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 1n103

输出描述

一个整数,表示使得字符串变成回文串的最小法力值。

样例

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值