每个样例先输出最长的字符不重复子串的长度,然后按字典序输出这些不重复子串,每个子串输出一行,样例输入abcabc时,应该输出3 abc bca cab,请用c语言实现
时间: 2024-05-15 08:15:43 浏览: 63
```c
#include <stdio.h>
#include <string.h>
#define MAXN 1000
char s[MAXN+1];
int hashtable[256] = {0}; // 哈希表,记录字符是否出现过
int start = 0, end = 0; // 当前不重复子串的起始和结束位置
int max_len = 0; // 最长的不重复子串长度
int main() {
scanf("%s", s);
int len = strlen(s);
while (end < len) {
if (hashtable[s[end]] == 0) { // 当前字符第一次出现
hashtable[s[end]] = 1; // 标记为已出现
end++;
if (end - start > max_len) { // 更新最长不重复子串信息
max_len = end - start;
}
} else { // 当前字符已经出现过
hashtable[s[start]] = 0; // 将起始位置的字符标记为未出现
start++;
}
}
printf("%d\n", max_len);
start = 0, end = 0;
max_len = 0;
memset(hashtable, 0, sizeof(hashtable)); // 重置哈希表
while (end < len) {
if (hashtable[s[end]] == 0) { // 当前字符第一次出现
hashtable[s[end]] = 1; // 标记为已出现
end++;
if (end - start > max_len) { // 更新最长不重复子串信息
max_len = end - start;
}
} else { // 当前字符已经出现过
hashtable[s[start]] = 0; // 将起始位置的字符标记为未出现
start++;
}
if (end - start == max_len) { // 满足最长不重复子串长度
for (int i = start; i < end; i++) {
printf("%c", s[i]); // 输出不重复子串
}
printf("\n");
}
}
return 0;
}
```
阅读全文