用c语言写一个程序实现找出最长公共后缀字符串的功能
时间: 2023-05-23 11:03:22 浏览: 123
C语言求解最长公共子字符串问题及相关的算法分析
可以使用字典树(Trie)的方法进行最长公共后缀的查找,具体实现步骤如下:
1. 将所有字符串插入到字典树中,并记录每个节点的出现次数。
2. 从根节点开始,对每个节点的子节点按照字典序排序,遍历排序后的最后一个节点。
3. 如果某个节点的出现次数等于字符串个数,说明这个节点可以作为最长公共后缀的候选节点。
4. 对于所有的候选节点,按照深度从小到大排序,选取深度最大的节点作为最长公共后缀。
实现代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_N 100
#define MAX_L 100
typedef struct Node {
int cnt;
struct Node* next[26];
} Node;
void insert(Node* root, char* str) {
int len = strlen(str);
Node* cur = root;
for (int i = len - 1; i >= 0; --i) {
int idx = str[i] - 'a';
if (cur->next[idx] == NULL) {
cur->next[idx] = (Node*) malloc(sizeof(Node));
memset(cur->next[idx], 0, sizeof(Node));
}
cur = cur->next[idx];
++cur->cnt;
}
}
int dfs(Node* root, char* ans, int dep) {
int flag = 0;
for (int i = 0; i < 26; ++i) {
if (root->next[i] != NULL && root->next[i]->cnt == MAX_N) {
ans[dep] = 'a' + i;
flag = 1;
dfs(root->next[i], ans, dep + 1);
}
}
if (!flag && dep > 0) {
ans[dep] = '\0';
return 1;
}
return 0;
}
int main() {
int n;
char str[MAX_N][MAX_L];
Node* root = (Node*) malloc(sizeof(Node));
memset(root, 0, sizeof(Node));
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%s", str[i]);
insert(root, str[i]);
}
char ans[MAX_L];
dfs(root, ans, 0);
if (strcmp(ans, "") == 0) {
printf("No common suffix found.\n");
} else {
printf("The longest common suffix is \"%s\"\n", ans);
}
return 0;
}
阅读全文