NOI / 1.7编程基础之字符串 提问34:回文子串 c语言

描述

给定一个字符串,输出所有长度至少为2的回文子串。

回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。

输入

一个字符串,由字母或数字组成。长度500以内。

输出

输出所有的回文子串,每个子串一行。
子串长度小的优先输出,若长度相等,则出现位置靠左的优先输出。

样例输入

123321125775165561

样例输出

33
11
77
55
2332
2112
5775
6556
123321
165561
#include 
#include 

char s[505]; // 定义字符数组s,用于存储输入的字符串
int len; // 定义整型变量len,用于存储字符串的长度

// 判断从st开始,长度为l的子串是否为回文串
int isPalin(int st, int l) {
    for (int i = st, j = st + l - 1; i < j; ++i, --j) { // 使用双指针法,分别从子串的首尾向中间遍历
        if (s[i] != s[j]) // 如果发现不相等的字符,则返回0,表示不是回文串
            return 0;
    }
    return 1; // 如果所有字符都相等,则返回1,表示是回文串
}

// 输出从st开始,长度为l的子串
void show(int st, int l) {
    for (int i = st; i <= st + l - 1; ++i) // 遍历子串中的每个字符
        printf("%c", s[i]); // 输出字符
    printf("\n"); // 输出换行符
}

int main() {
    scanf("%s", s); // 读取输入的字符串
    len = strlen(s); // 计算字符串的长度
    for (int l = 2; l <= len; ++l) { // 遍历所有可能的子串长度
        for (int i = 0; i <= len - l; ++i) { // 遍历所有可能的子串起始位置
            if (isPalin(i, l)) // 如果当前子串是回文串
                show(i, l); // 输出子串
        }
    }
    return 0; // 程序正常结束
}

你可能感兴趣的:(c语言,算法,开发语言)