如有错误多多指正!
【问题描述】
文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一个实现这一目标的文字统计系统,称为"文学研究助手"。
【测试数据】
以你的C源程序模拟英文小说,C语言的保留字集作为待统计的词汇集。
【实现提示】
约定小说中的词汇一律不跨行。这样,每读入一行,就统计每个词在这行中的出现次数。出现位置所在行的行号可以用链表存储。若某行中出现了不止一次,不必存多个相同的行号。
如果读者希望达到选做部分(1)和(2)所提出的要求,则首先应把KMP算法改写成如下的等价形式,再将它推广到多个模式的情形。
这个主要使用了KMP算法,并且这个KMP算法的next数组是从下标从1开始的,学习注意参考:KMP算法(快速模式匹配算法)详解以及C语言实现 (biancheng.net)
在此处可以引出KMP算法的学习以及解释(下标从0开始): (61条消息) 【详解】KMP算法——多图,多例子(c语言)_Zero0Tw0的博客-优快云博客
使用
目录
KMP算法:
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 1000//定义串的长度;
typedef char SString[MaxSize + 1];//定义一个字符数组,并取别名;
int next[MaxSize];//用于kmp算法,主要存储每个字符的前后缀的值;
int length(SString str){
int i=1;
while(str[i]){
i++;
}
return i-1;
}
void get_next(SString T,int nextval[]){
// int i,k;
// i=1,k=0;
// next[1]=0; //next数组是与p传长度相同的int型数组,数组的每个位置记录了模式串串对应位置匹配失败后要回溯的下标。
// while(i<T[0]){//T[0]储存的是字符串的长度,
// if(k==0||T[i]==T[k]){
// ++i;
// ++k;
// next[i]=k;
// }
// else{
// k=next[k];//否则k只的值回溯
// }
// }
int i=1;
next[1]=0;
int k=0;
while (i<T[0]) {
if (k==0||T[i-1]==T[k-1]) {
i++;
k++;
if (T[i-1]!=T[k-1]) {
文学研究助手是一个系统,用于统计英文小说中特定形容词的出现次数和位置。该系统采用KMP算法进行高效模式匹配,通过逐行读取文本并利用KMP算法的next数组(从1开始)来实现。文章提供了KMP算法的详细解释和C语言实现链接,同时对比了使用和不使用KMP算法的情况。
订阅专栏 解锁全文
6928

被折叠的 条评论
为什么被折叠?



