1)串的基本操作
#include <stdio.h>
#define MaxSize 255
typedef struct
{
char ch[MaxSize];
int len;
}MyString;
//从指定位序开始截取串的子串
bool SubString(MyString &Sub,MyString S,int pos,int len)
{
if(pos+len-1>S.len) return false; //子串范围越界
for(int i=pos;i<pos+len;i++)
{
Sub.ch[i-pos+1]=S.ch[i];
}
Sub.len=len;
return true;
}
//比较两个串的大小
int CompareString(MyString S1,MyString S2)
{
//逐个字符比较
for(int i=1;i<=S1.len&&i<=S2.len;i++)
{
if(S1.ch[i]!=S2.ch[i]) return S1.ch[i]-S2.ch[i];
}
//扫描过的字符皆相同,比较两字符串长度
return S1.len-S2.len;
}
//定位子串
int indexString(MyString S,MyString Sub)
{
//暂存截取串
int i=1;
MyString temp;
temp.len=Sub.len;
while(i<=S.len-Sub.len+1)
{
SubString(temp,S,i,Sub.len);
if(CompareString(Sub,temp)!=0) ++i;
else return i;
}
return 0;
}
//串的基本操作
int main(void)
{
MyString S1;
S1.ch[0]=NULL;
S1.ch[1]='w';
S1.ch[2]='z';
S1.len=2;
MyString S2;
S2.ch[0]=NULL;
S2.ch[1]='z';
S2.len=1;
printf("%d\n",indexString(S1,S2));
return 0;
}2)串的朴素模式匹配算法
//串的朴素模式匹配算法
int Index(MyString S,MyString Sub)
{
int i,j,k;//k用于定位S当前匹配到哪个位置,i,j分别用于S与Sub的活动定位
k=1;
i=k;
j=1;
while(S.len-k+1<=Sub.len)
{
if(S.ch[i]==Sub.ch[j])
{
++i;
++j;
}
else
{
j=1;
++k;
i=k;
}
if(j>Sub.len) return k;
else return 0;
}
}
京公网安备 11010502036488号