您的位置:首页 > 其它

字符串模式匹配算法

2009-10-18 23:01 387 查看
题目:给定两个字符串S和T,判断T是否在S中出现

======================

思路如下(引用),采用最简单的匹配方法:

在串S=”abcabcabdabba”中查找T=” abcabd”(我们可以假设从下标0开始):先是比较S[0]和T[0]是否相等,然后比较S[1] 和T[1]是否相等…我们发现一直比较到S[5] 和T[5]才不等。如图:



当这样一个失配发生时,T下标必须回溯到开始,S下标回溯的长度与T相同,然后S下标增1,然后再次比较。如图:
这次立刻发生了失配,T下标又回溯到开始,S下标增1,然后再次比较。如图:



这次立刻发生了失配,T下标又回溯到开始,S下标增1,然后再次比较。如图:



又一次发生了失配,所以T下标又回溯到开始,S下标增1,然后再次比较。这次T中的所有字符都和S中相应的字符匹配了。函数返回T在S中的起始下标3。如图:



/*
Name:字幕串模式匹配
Author:Dualeak
Blog:http://blog.csdn.net/Dualeak
Date:2009-10-18
Description:判断字符串S是否包含字符串T
*/
#include "stdio.h"
int main(void)
{
char S[]={"abcabcabdabba"}, T[]={"abcabd"};
int	sumS=sizeof(S)-2,	/*数组S的下标上限*/
sumT=sizeof(T)-2,	/*/*数组T的下标上限*/
border=sumS-sumT;	/*循环停止标志*/
int	i=0,			/*S的下标*/
j=0,			/*T的下标*/
k=-1;			/*k=-1表示字符串S未包含字符串T*/
//若i>border(即sumS-i>sumT)则循环无意义(因为接下来需要判断的S的长度已经小于T的长度,不可能再包含T).
//若-1 != k,则表示已确定S包含T,则循环终止.
for(i=0;(i <= border) && (-1 == k);i++){
//若S[i+j] != T[j],即当前S的一个字符与当前T的一个字符不匹配,或者-1 != k,则返回上层循环
for(j=0;(S[i+j] == T[j]) && (-1 == k);j++){
//判断是否到了字符串T的末尾,若是到了末尾,则表示整串全部匹配,k=i
if(j == sumT) k=i;
}
}
if(-1 != k) printf("yes/n");
else printf("no/n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: