用C语言实现,给定一个字符串,输出其中最长的对称子字符串及长度,若有多个则全部输出。
时间: 2024-12-17 14:22:34 浏览: 15
在C语言中,我们可以使用双指针技巧来寻找最长的对称子串。这里有一个简单的实现,先判断每个字符是否可以构成对称子串,然后逐步扩大搜索范围直到找到最长的对称子串。以下是完整的代码:
```c
#include <stdio.h>
#include <string.h>
// 定义一个辅助函数,用于检查字符串s[i...j]是否是对称的
int isSymmetric(char *s, int i, int j) {
while (i < j) {
if (s[i] != s[j]) {
return 0; // 非对称
}
i++; j--;
}
return 1; // 对称
}
// 找最长对称子串
void findLongestPalindrome(char *str) {
int len = strlen(str);
if (len <= 1) {
printf("单个字符本身就是对称的。\n");
return;
}
int longest_len = 1;
char longest_start = 0;
// 从每个位置开始,尝试找出最长的对称子串
for (int center = 0; center < len; center++) {
int left = center, right = center;
// 循环左指针向左,右指针向右,寻找对称的子串
while (left >= 0 && right < len && str[left] == str[right]) {
int current_len = right - left + 1;
if (current_len > longest_len) {
longest_len = current_len;
longest_start = left;
}
left--; right++;
}
}
// 输出最长对称子串及其长度
if (longest_len > 1) {
printf("最长对称子串: ");
for (int i = longest_start; i < longest_start + longest_len; i++) {
printf("%c", str[i]);
}
printf("\n长度: %d\n", longest_len);
} else {
printf("输入的字符串没有对称子串。\n");
}
}
int main() {
char str[100];
printf("请输入一个字符串: ");
fgets(str, sizeof(str), stdin); // 要去掉换行符
str[strcspn(str, "\n")] = '\0'; // 去掉换行符
findLongestPalindrome(str);
return 0;
}
```
当运行这个程序并输入字符串时,它将输出其中最长的对称子串及其长度。如果有多个等长的对称子串,这个程序只会返回其中一个。如果你希望得到所有相同的最长对称子串,你需要稍作调整,比如使用动态规划或哈希集合来存储所有找到的对称子串。
阅读全文