串的朴素模式匹配算法
算法思想
1、从主串S的首字符出发遍历(int i)所有后方字符总数不小于T.length的字符。
2、若存在与T的首字符匹配的字符,再将T的字符和该字符后的字符一一对应,若均匹配,则返回i,否则继续遍历。
3、若遍历完所有字符均不满足条件,则返回-1。
代码
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<stack>
#include<iostream>
using namespace std;
#define MaxSize 100
//静态定义串
typedef struct string {
char str[MaxSize]; //每个分量存储一个字符
int length; //串的实际长度
}String;
//朴素模式匹配
int Index(String S, String T) {//返回T的首字符位置,否则返回0
if (T.length > S.length)
{
return 0;//模式串长于主串,一定不存在
}
for (int i = 0; i < S.length - T.length + 1; i++)
{
if (S.str[i] == T.str[0])//若存在与T的首字符匹配的字符
{
if (T.length == 1)
{
i++;
return i;//若模式串长度为1,匹配
}
int j = ++i;
int k = 1;
while (S.str[j] == T.str[k] && k < T.length)//将T的字符和该字符后的字符一一对应
{
j++;
k++;
if (k == T.length)
{
return i;//若均匹配,则返回i
}
}
}
}
return -1;
}
int main(void) {
String s1, s2;
cout << "请输入主串s1的内容:" << endl;
cin >> s1.str;
s1.length = strlen(s1.str);
cout << "请输入模式串s2的内容:" << endl;
cin >> s2.str;
s2.length = strlen(s2.str);
int m = Index(a, b);
if (m != -1)
{
cout << "s1中存在s2,s2首字符位于s1的第" << m << "个字符处。";
}
else
{
cout << "s1中不存在s2。" << endl;
};
return 0;
}