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

特殊的回文子串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 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分