《数据结构(C语言版)》之“串的模式匹配算法”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《数据结构(C语言版)》之“串的模式匹配算法”相关的知识,希望对你有一定的参考价值。

串的模式匹配算法
>>>1.定义串的顺序存储结构。
>>>2.编写函数实现串的初始化、分配、取子串算法。
>>>3.编写函数据实现串的模式匹配。
>>>4.分析算法。
请大神给个满足以上要求的代码,我去上机运行啊!明天就要,急需!
注意我要程序代码啊,先谢谢各位!务必注意要求哦~

参考技术A # include <string.h>
# include <stdio.h>
# include <stdlib.h>
# define OK 1
# define ERROR 0
typedef int Status;
//串的定长顺序存储结构
# define MAX_STR_LEN 40
typedef char SString[MAX_STR_LEN + 1];//0号单元存放串的长度
Status StrAssign(SString T,char * chars)//生成一个其值等于chars的串T

int i;
if (strlen(chars) > MAX_STR_LEN)

return ERROR;

else

T[0] = strlen(chars);
for (i=1; i<=T[0]; ++i)

T[i] = * (chars + i - 1);

return OK;


//返回串S的元素的个数
int StrLength(SString S)

return S[0];

//用Sub返回串S的自第pos个字符起长度为len的子串
Status SubString(SString Sub,SString S,int pos,int len)

int i;
if (pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)

return ERROR;

for (i=1; i<=len; ++i)

Sub[i] = S[pos+i-1];

Sub[0] = len;
return OK;

//输出字符串T
void StrPrint(SString T)

int i;
for (i=1; i<=T[0]; ++i)

printf("%c ",T[i]);

printf("\n");

//求模式串T的next函数值并存入数组next
void get_next(SString T,int next[])

int i = 1,j = 0;
next[1] = 0;
while (i < T[0])

if (j==0 || T[i]==T[j])

++i;
++j;
next[i] = j;

else

j = next[j];



//求模式串T的next函数修正值并存入数组nextval
void get_nextval(SString T,int nextval[])

int i = 1,j = 0;
nextval[1] = 0;
while (i < T[0])

if (j==0 || T[i]==T[j])

++i;
++j;
if (T[i] != T[j])

nextval[i] = j;

else

nextval[i] = nextval[j];


else

j = nextval[j];



//利用模式串T的next函数求T在主串S中第pos字符之后的位置的KMP算法
//1=<pos=<StrLength(S)
int Index_KMP(SString S,SString T,int pos,int next[])

int i = pos,j = 1;
while (i<=S[0] && j<=T[0])

if (j==0 || S[i]==T[j])

++i;
++j;

else

j = next[j];


if (j > T[0])

return i - T[0];

else

return 0;


int main(void)

int i,* p;
SString s1,s2;
StrAssign(s1,"aaabaaaab");
printf("主串为:");
StrPrint(s1);
StrAssign(s2,"aaaab");
printf("子串为:");
StrPrint(s2);
p = (int *)malloc((StrLength(s2) + 1) * sizeof(int));
get_next(s2,p);
printf("子串的next的数组为:");
for (i=1; i<=StrLength(s2); ++i)

printf("%d ",* (p+i));

printf("\n");
i = Index_KMP(s1,s2,1,p);
if (i)

printf("主串和子串在第%d个字符处首次匹配\n",i);

else

printf("主串和子串匹配不成功\n");

get_nextval(s2,p);
printf("子串的nextval数组为:");
for (i=1; i<=StrLength(s2); ++i)

printf("%d ",* (p+i));

printf("\n");
printf("主串和子串在第%d个字符处首次匹配\n",Index_KMP(s1,s2,1,p));
printf("求串s1的从第5个字符起长度为5的子串s2:\n");
SubString(s2,s1,5,5);
printf("串s2为:");
StrPrint(s2);
return 0;

/*
在vc++6.0中的输出结果:
------------------------
主串为:a a a b a a a a b
子串为:a a a a b
子串的next的数组为:0 1 2 3 4
主串和子串在第5个字符处首次匹配
子串的nextval数组为:0 0 0 0 4
主串和子串在第5个字符处首次匹配
求串s1的从第5个字符起长度为5的子串s2:
串s2为:a a a a b
Press any key to continue
------------------------------
*/追问

谢谢了,能写点本程序算法分析吗?实在不知道该咋写啊。

追答

建议找一些简单例子 自己运行一下 可以加些输出语句

本回答被提问者采纳

串的模式匹配算法

尴尬啊,大学数据结构课程用的书看到了现在。说起来这本书在业内也是相当有名,它就是清华大学出版社出版的《数据结构(C语言版)》。在该书的 4.3 节,讲解了“串的模式匹配算法”,个人感觉这一节应该是前四章最值得看的一节了。下面就说说相关算法的爪哇实现吧!

简单粗暴

首先,肯定还是说最简单最暴力的方法喽,没废话就是从前向后遍历:

/**
 * Cerated by clearbug on 2018/2/23.
 *
 * 串的模式匹配算法
 */
public class SubStrMatcher {

    public static void main(String[] args) {
        System.out.println(indexForce("ababcabcacbab", "abcac", 5));
        System.out.println(indexForce("00000000000000000000000000000000000000000000000001", "0000000001", 0));
    }

    /**
     * 朴素字符串匹配算法
     *
     * @param s 主串
     * @param t 模式串
     * @param pos 匹配操作起始位置
     * @return 若模式串匹配不成功,则返回 -1;否则,返回主串中第一次匹配成功的子串的索引值;
     */
    public static int indexForce(String s, String t, int pos) {
        char[] sArr = s.toCharArray();
        char[] tArr = t.toCharArray();

        int sLen = sArr.length;
        int tLen = tArr.length;
        int i = pos, j = 0;
        while (i < sLen && j < tLen) {
            if (sArr[i] == tArr[j]) {
                i++;
                j++;
            } else {
                i = i -j + 1;
                j = 0;
            }
        }
        if (j == tLen) { // 匹配成功了
            return i - j;
        }
        return -1;
    }
}

优雅点

以上是关于《数据结构(C语言版)》之“串的模式匹配算法”的主要内容,如果未能解决你的问题,请参考以下文章

串的模式匹配算法之kmp

谁有《数据结构》(C语言版)严蔚敏,清华大学2005年的课本?麻烦把目录告知,非常感谢

(王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)

串的模式匹配算法

4.2 串的模式匹配算法

第四章:2.串 -- 串的模式匹配算法(KMP)