Kattis - names Palindrome Names 【字符串】

题目链接

https://open.kattis.com/problems/names

题意
给出一个字符串
有两种操作
0.在字符串的最末尾加一个字符
1.更改字符串中的一个字符

求最少的操作步数使得字符串变成回文串

思路
由于回文串具有对称关系

所以给出一串回文串 最多的操作步数 就是 len / 2
只改一半不同的字符就可以了

所以我们可以先将字符串倒置

然后依次一步一步 挪过去 与原串比较 比出有多少个不同的字符

那么操作次数就是 挪位数+不同字符个数/ 2

比如说
样例

kaia
aiak 挪位数 0 不同字符个数 4 总操作数 2

kaia
aiak 挪位数 1 不同字符个数 0 总操作数1
就是答案了

AC代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define CLR(a, b) memset(a, (b), sizeof(a))
#define pb push_back
#define bug puts("***bug***");
//#define gets gets_s

using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair  pll;
typedef pair <string, int> psi;
typedef pair <string, string> pss;
typedef pair <double, int> pdi;

const double PI = acos(-1.0);
const double E = exp(1.0);
const double eps = 1e-8;

const int INF = 0x3f3f3f3f;
const int maxn = 1e4 + 10;
const int MOD = 1e9 + 7;

int main()
{
    string s;
    getline(cin, s);
    string tmp = s;
    reverse(s.begin(), s.end());
    int len = s.size();
    int ans = len / 2;
    for (int i = 0; i < len; i++)
    {
        int step = i;
        int dif = 0;
        for (int j = i, k = 0; j < len; j++, k++)
        {
            if (tmp[j] != s[k])
                dif++;
        }
        dif /= 2;
        ans = min(ans, dif + step);
    }
    cout << ans << endl;
}

你可能感兴趣的:(字符串)