04 串

04 串

04 串_第1张图片

  1. 定义

    串(String)是由零个或多个字符组成的有限序列,又名叫字符串。

     ADT 串(string)
     Data
            串中元素仅由一个字符组成,相邻元素具有前驱和后继关系
     Operation
           StrAssign(T,*chars):生成一个其值等于字符串常量chars的串T。
           StrCopy(T,S):串S存在,由串S复制得串T。
           ClearString(S):串S存在,将串清空。
           StringEmpty(S):若串为空,则返回true,否则返回false。
           StrLength(S):返回S的元素个数,即串S的长度。
           StrCompare(S,T):若S>T,返回>0,S=T,返回=0,S
  2. 顺序存储结构

  3. 链式存储结构

  4. 朴素的模式匹配算法:最坏情况的时间复杂度为O((n-m+1)*m)

子串的定位操作通常称做串的模式匹配

	/* 朴素的模式匹配法 */
	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;
	}
  1. KMP模式匹配算法

    1. 原理
    2. 实现

    对于get_next函数来说,若T的长度为m,因只涉及到简单的单循环,其时间复杂度为O(m),而由于i值不回溯,使得index_KMP算法效率得以提高,while循环的时间复杂度为O(n)。因此,整个算法的时间复杂度为O(m+n)。相较于朴素模式匹配算法的O((n-m+1)*m)来说,是要好一些。但这里也需要强调,KMP算法仅当模式与主串之间存在许多“部分匹配”的情况下才体现出它的优势,否则两者差异并不明显。

     	/* 通过计算返回子串T的next数组。 */
     	void get_next(String T, int *next) 
     	{
     		int i,j;
     	  	i=1;
     	  	j=0;
     	  	next[1]=0;
     	  	while (i T[0]) 
     			return i-T[0];
     		else 
     			return 0;
     	}
    
    1. 改进:将get_next(T,next)改为get_nextval(T,next)

       /* 求模式串T的next函数修正值并存入数组nextval */
       void get_nextval(String T, int *nextval) 
       {
         	int i,j;
         	i=1;
         	j=0;
         	nextval[1]=0;
         	while (i

下载资源

资源链接

你可能感兴趣的:(数据结构,数据结构,串)