编写用自动机识别输入字符串的C代码
时间: 2024-04-29 11:25:59 浏览: 138
字符串匹配的c程序
以下是示例代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_CHAR 256 // 最大字符数
// 自动机节点结构体
typedef struct Node {
struct Node* next[MAX_CHAR]; // 指向下一个节点的指针数组
bool isEnd; // 标记是否是一个字符串的结束
} Node;
// 创建自动机节点的函数
Node* createNode() {
Node* node = (Node*)malloc(sizeof(Node));
for(int i = 0; i < MAX_CHAR; i++) {
node->next[i] = NULL;
}
node->isEnd = false;
return node;
}
// 向自动机中添加一个字符串的函数
void insert(Node* root, char* str) {
Node* p = root;
int i = 0;
while(str[i]) { // 遍历字符串每一个字符
int index = (int)str[i];
if(p->next[index] == NULL) { // 如果当前节点的下一个节点为空,说明该字符还没有被添加过
p->next[index] = createNode(); // 创建新的节点
}
p = p->next[index]; // 移动到下一个节点
i++;
}
p->isEnd = true; // 表示这是一个字符串的结尾
}
// 判断字符串是否在自动机中的函数
bool search(Node* root, char* str) {
Node* p = root;
int i = 0;
while(str[i]) { // 遍历字符串每一个字符
int index = (int)str[i];
if(p->next[index] == NULL) { // 如果当前节点的下一个节点为空,说明该字符串不在自动机中
return false;
}
p = p->next[index]; // 移动到下一个节点
i++;
}
return p->isEnd; // 如果当前节点是一个字符串的结尾,说明该字符串在自动机中
}
int main() {
Node* root = createNode(); // 创建自动机的根节点
// 添加一些字符串
insert(root, "apple");
insert(root, "banana");
insert(root, "orange");
// 判断一些字符串是否在自动机中
if(search(root, "apple")) {
printf("apple is in the trie.\n");
}
if(search(root, "peach")) {
printf("peach is in the trie.\n");
} else {
printf("peach is not in the trie.\n");
}
return 0;
}
```
这段代码实现了一个基于字典树(Trie)的自动机,可以用来快速地识别输入字符串是否在一个固定集合中。通过对每个字符的遍历和字符编码的映射,可以快速地判断一个字符串是否在自动机中。
阅读全文