留名140 2023-03-24 20:40 采纳率: 100%
浏览 19
已结题

特殊的回文子串C语言

给定一个字符串s,s中只包含数字,请返回s中最长的特殊的回文子串的长度
特殊的回文子串t满足
t进行任何次交换后可以变成一个回文字符申
输入格式:
输入第一行包含一个字符串s
输出格式:
特殊的回文子串的最长长度

有无给个正确算法

  • 写回答

3条回答 默认 最新

  • 海洋 之心 2022年度博客之星人工智能领域TOP 1 2023-03-24 20:52
    关注

    算法思路:

    1. 首先判断字符串s是否为回文串,如果是,则s本身就是特殊的回文子串,直接返回s的长度;
    2. 如果s不是回文串,则遍历s中的每个字符,以该字符为中心向两侧扩展,寻找最长的回文子串,记为s1;
    3. 对于s1的每个字符,将其和其它字符交换后再次判断是否为回文串,如果是,则更新最长的特殊回文子串的长度。

    C语言实现:

    #include <stdio.h>
    #include <string.h>
    
    int is_palindrome(char *s, int start, int end) {
        while (start < end) {
            if (s[start] != s[end]) {
                return 0;
            }
            start++;
            end--;
        }
        return 1;
    }
    
    int longest_special_palindrome(char *s) {
        int n = strlen(s);
        int max_len = 0;
    
        /* 判断s本身是否为回文串 */
        if (is_palindrome(s, 0, n - 1)) {
            return n;
        }
    
        /* 以每个字符为中心向两侧扩展 */
        for (int i = 0; i < n; i++) {
            int len = 1;
            while (i - len >= 0 && i + len < n && s[i - len] == s[i + len]) {
                len++;
            }
            if (len > 1) {
                /* 对于每个回文子串,交换其中的字符判断是否为特殊回文子串 */
                for (int j = i - len + 1; j <= i + len - 1; j++) {
                    for (int k = j + 1; k <= i + len - 1; k++) {
                        char tmp = s[j];
                        s[j] = s[k];
                        s[k] = tmp;
                        if (is_palindrome(s, i - len + 1, i + len - 1)) {
                            max_len = len;
                        }
                        /* 恢复原来的字符串 */
                        tmp = s[j];
                        s[j] = s[k];
                        s[k] = tmp;
                    }
                }
            }
        }
    
        return max_len;
    }
    
    int main() {
        char s[100];
        scanf("%s", s);
        int len = longest_special_palindrome(s);
        printf("%d\n", len);
        return 0;
    }
    

    时间复杂度:$O(n^3)$,其中$n$为字符串s的长度。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 已采纳回答 4月7日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 QT6颜色选择对话框显示不完整
  • ¥20 能提供一下思路或者代码吗
  • ¥15 用twincat控制!
  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 单通道放大电路的工作原理
  • ¥30 YOLO检测微调结果p为1
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下