用c语言设计一算法:输入字符串 S,以‘!’为结束标志,如果串 S 中不存在等值子串,则输出信息:” 无等值子串”,否则求出(输出)一个长度最大的等值子串。
时间: 2023-12-10 09:39:27 浏览: 67
给任意长度的字符串,加CRC校验码的c语言算法.rar
以下是用C语言设计的算法:
```c
#include <stdio.h>
#include <string.h>
int main() {
char s[100];
printf("请输入字符串S(以'!'为结束标志):\n");
scanf("%s", s);
int len = strlen(s);
int max_len = 0; // 最大等值子串的长度
int max_start = 0; // 最大等值子串的起始位置
for (int i = 0; i < len; i++) {
for (int j = i + 1; j <= len; j++) {
// 取出子串
char sub_s[100];
strncpy(sub_s, s + i, j - i);
sub_s[j - i] = '\0';
// 判断子串是否等值
int is_equal = 1;
for (int k = 1; k < j - i; k++) {
if (sub_s[k] != sub_s[0]) {
is_equal = 0;
break;
}
}
// 更新最大等值子串的信息
if (is_equal && j - i > max_len) {
max_len = j - i;
max_start = i;
}
}
}
if (max_len == 0) {
printf("无等值子串\n");
} else {
char max_sub_s[100];
strncpy(max_sub_s, s + max_start, max_len);
max_sub_s[max_len] = '\0';
printf("最大等值子串为:%s\n", max_sub_s);
}
return 0;
}
```
这个算法的思路比较简单,就是遍历所有可能的子串,然后判断是否等值,并记录最大等值子串的信息。时间复杂度为 $O(n^3)$,当字符串较长时可能会比较慢。
阅读全文