使用C语言具体实现设计一个算法,求非空链串s中最长等值子串的长度
时间: 2023-06-09 20:07:26 浏览: 132
好的,针对您的问题,可以使用哈希表来解决。首先定义两个指针i和j,分别指向链串头部和第二个元素。然后使用哈希表来记录每个字符最后一次出现的位置。如果哈希表中当前字符已经出现过,更新i为当前字符的位置+1,否则将当前字符加入哈希表中,并且更新最大子串长度。最后返回最大子串长度即可。
以下是具体实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000000
#define HASH 1000007
int hash_table[HASH], Next[MAXN], H[MAXN];
char S[MAXN];
int hash(char s[]) {
int res = 0;
for (int i = 0; s[i]; i++) {
res = (res * 26 + s[i] - 'a') % HASH;
}
return res;
}
int main() {
scanf("%s", S);
int n = 0;
for (int i = 0; S[i]; i++) {
H[i] = hash(S + i);
if (!hash_table[H[i]]) hash_table[H[i]] = i + 1;
Next[n++] = hash_table[H[i]] - 1;
hash_table[H[i]] = i + 1;
}
int i = 0, j = 1, ans = 1;
while (j < n) {
if (H[i] == H[j]) {
i++;
j++;
} else if (Next[i] >= i) {
i = Next[i];
} else {
i = j;
j++;
}
ans = j - i > ans ? j - i : ans;
}
printf("%d\n", ans);
return 0;
}
```
这个算法的时间复杂度为O(n),其中n是链串的长度。
阅读全文