码迷,mamicode.com
首页 > 其他好文 > 详细

匹配主串与子串的过程

时间:2014-09-19 09:59:45      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:http   os   ar   代码   on   c   amp   ef   算法   

我们思考下算法,然后设计函数。假设主串 s1=nowamagic.net,子串sub=magic。我们要寻找sub在s1中的首个出现位置

  1. 设i用于主串s1中当前位置下标值,j用于子串sub中当前位置下标值。伯爵娱乐城
  2. 首先我们比较s1[1]与sub[1],如果相同的话,可能子串就开始了。
  3. 如果不相等,那么子串仍然是从sub[1]开始,而主串s1则以s1[2]与其比较。
  4. 如果连续出现5次或以上匹配,那么就找到子串了,此时的j必然大于子串长度sub[0]。
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
/* 其中,T非空,1≤pos≤StrLength(S)。 */
int Index(String S, String T, int pos)
{
	int i = pos;	/* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
	int j = 1;				/* j用于子串T中当前位置下标值 */
	while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
	{
		if (S[i] == T[j]) 	/* 两字母相等则继续 */
      	{
			++i;
         	++j;
      	}
      	else 				/* 指针后退重新开始匹配 */
      	{
         	i = i-j+2;		/* i退回到上次匹配首位的下一位 */
         	j = 1; 			/* j退回到子串T的首位 */
      	}
	}
	if (j > T[0])
		return i-T[0];
	else
		return 0;
}

测试执行代码为:

case 6:
	printf("主串s1为: ");
	StrPrint(s1);
	k=StrAssign(sub,"magic");
	printf("子串sub为: ");
	StrPrint(sub);
	i=Index(s1,sub,1);
	printf("s1的第%d个字母起和sub第一次匹配\n",i);
	break;

程序运行结果:

1.StrAssign 生成串
2.StrLength 求串长
3.StrCompare 串比较
4.Concat 串连接
5.SubString 求子串
6.Index 求子串位置
0.退出
请选择你的操作:
1
串s1为:nowamagic.net

6
主串s1为: nowamagic.net
子串sub为: magic
s1的第5个字母起和sub第一次匹配

完整的程序在后面部分会给出,就不必每篇都贴了。

匹配主串与子串的过程

标签:http   os   ar   代码   on   c   amp   ef   算法   

原文地址:http://www.cnblogs.com/laoyangman/p/3980740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!