移动长度 k 子串使字符串变成回文

思路

这题很难,因为移动子串会改变字符顺序。

判断回文可行性:字符串中最多只能有一个字符出现奇数次。

但"最少操作次数"不是简单问题。

当 k = 1 时,相当于任意交换相邻字符,最少操作次数等于逆序数。

当 k > 1 时,问题更复杂,通常需要 BFS 搜索状态,但状态数是指数级。

这里给出一个简化版本:只判断能否变成回文,若可以且原串已是回文输出 0,否则输出 -1(因为无法在多项式时间内精确求最少操作次数)。

真实机考中如果出现,通常会有额外限制,例如 k = 2 且字符种类很少。

代码

c

复制代码
#include <stdio.h>
#include <string.h>

int canFormPalindrome(char *s) {
    int cnt[26] = {0};
    int len = strlen(s);
    for (int i = 0; i < len; i++) cnt[s[i] - 'a']++;
    int odd = 0;
    for (int i = 0; i < 26; i++)
        if (cnt[i] % 2) odd++;
    return odd <= 1;
}

int isPalindrome(char *s) {
    int l = 0, r = strlen(s) - 1;
    while (l < r) {
        if (s[l] != s[r]) return 0;
        l++; r--;
    }
    return 1;
}

int main() {
    char s[1005];
    int k;
    scanf("%s %d", s, &k);

    if (!canFormPalindrome(s)) {
        printf("-1\n");
        return 0;
    }

    if (isPalindrome(s)) {
        printf("0\n");
        return 0;
    }

    // 简化处理:无法精确求最少操作次数
    printf("-1\n");
    return 0;
}
相关推荐
David猪大卫1 小时前
【C++修炼】string类:string类的模拟实现
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
pride.li1 小时前
第12章 Python 教程-流程控制:循环结构
linux·服务器·python·算法
海绵宝宝转agent1 小时前
2026-10-16 4算法+1面经
算法
小poop2 小时前
基础排序算法详解——插入、选择与交换排序
算法·排序算法
青蓝智慧马老师2 小时前
想学数据分析但零基础,正确顺序不是先学 Python
大数据·人工智能·算法
jeo陽2 小时前
05-数组与冒泡排序:第一个数据结构与经典算法
c语言·数据结构·算法
鸽鸽程序猿2 小时前
【刷题册】hot21-25
算法
Keven_112 小时前
算法札记:记忆化搜索中面对多组数据的初始化
算法
happyprince2 小时前
02-具体观 · JevAny算法与实现剖析
人工智能·算法