任务
Index(S,T,pos)
,在主串S
中,从pos
位置开始找与模式串T完全相同的子串,若找到,返回与T
的第一个字符相同的字符在S
中的序号,否则返回 0 。
过程
从主串的pos
位置位置开始,和模式串T
的第一个字符作比较。
若相等,则继续比较下一个字符;
若不相等,则从主串的下一个位置开始,重新与模式串的第一个字符作比较,如此往复。
若匹配成功返回与T
的第一个字符相同的字符在S
中的序号,否则返回 0 。
演示
S = "abcsabcabcde"
T = "abcde"
过了很久很久。。。。。(懒得不想画)
实现
C语言实现
#include<stdio.h>
#define MAX_LENTH 255
typedef unsigned char SString[MAX_LENTH + 1];
//0号单元 用来存储字符串长度,实际字符从 下标 1开始
int Index(SString S, SString T, int pos);
int Index(SString S, SString T, int pos)
{
int i = pos, j = 1;
while(i < S[0] && j < T[0])
{
if(S[i] == T[j])
{
i++;
j++;
}
else
{
i = i - j + 2;//注意此处,可以结合演示图片思考
j = 1;
}
}
if(j > T[0])
return i - T[0];
//注意此处,最后一步比较过后,还会有一次 i++,结合演示图片思考
else
return 0;
}
此算法中S[0],T[0]
在实际中就是字符串S
和T
的长度。
或者将其改为StrLength()(先不管怎么实现):
int Index(char S[], char T[], int pos)
//这里为通常意义的字符串char str[]
{
int i = pos, j = 1;
while(i < StrLength(S) && j < StrLength(T))
{
if(S[i] == T[j])
{
i++;
j++;
}
else
{
i = i - j + 1;//此时下标从零开始,有所变化
j = 0;
}
}
if(j > StrLength(T))
return i - StrLength(T);//这里仍然是减去模式串长度
else
return 0;
}