移动长度 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;
}
相关推荐
加宝的起点雷达3 小时前
40 条候选里 38 条来自同一个源,主卡整屏重样
人工智能·算法·创业
秋天的怀念_David3 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
闻缺陷则喜何志丹5 小时前
【C++特性】四种类型转
c++·算法·类型转换
喵本喵叁肆5 小时前
用 Boosting 把弱隐私算法炼成强隐私算法(英文原题:Boosting and Differential Privacy (FOCS 2010))
算法·集成学习·boosting
GrowingIO技术社区6 小时前
CDP、行为分析、归因与营销自动化有什么区别?
数据结构·数据挖掘·数据分析
GrowingIO技术社区6 小时前
实时标签怎样验收?从数据更新到分群可用
数据结构·数据挖掘·数据分析
青梅味猪大肠6 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统