データ構造-7文字列

空串:啥都没有(所有空串相等) 
空格串:若干空格组成的串
真子串:不包含自己的所有子串 
串相等:长度相等,且各个对应位置上的字符都相同 
串可以采用和线性表相同的存储结构 

顺序存储(用的多)
#define MAXLEN 255 
typedef struct{
    
    
	char ch[MAXLEN +1];		//[0]——[255],对于有些算法这样会简单一点 
	int length;			//串的当前长度 
}SString; 

块链(一个结点中放多个字符,以提高存储密度)
#define CHUNKSIZE 80;
typedef struct Chunk{
    
    		// 块 
	char ch[CHUNKSIZE];
	STRUCT CHUNK *NEXT;
} 

typedef struct{
    
    
	Chunk *head,*tail;
	int curlen;
}LString;

わからない場合は、最初に覚えておいてください

*****模式匹配*****
BF算法
S:aaaaab	长度m	i=1 
T:aaab		长度n	j=1 
挨个比较,匹配成功,i++ j++ 匹配下一个 j>=n匹配成功 
匹配失败:i = i-j+2(回溯)
		  j = 1 
		  
int index_BF(SString S,SString T){
    
    
	int i =1 ,j = i;
	while(i <= S.length && j<=T.length){
    
    
		if(s.ch[i]==t.ch[j])	{
    
    ++i;++j;}
		else{
    
    i = i-j+2;j = 1;}
	}
	
	if(i>=T.length) return i-T.length;
	else return 0; 
} 
时间复杂度O(m*n)


KMP算法 时间复杂度O(m+n) 
j	=		a b c a a b b c a b  c  a  a  b  d  a  b
  			1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 

next[j] = 	0 1 		//(1)当j=1时,next[j]=0 (通常前两个就是 0 1)
				1 1 	//(2) 其他情况 
					2	//(3)前面有k-1 = 1个字符一样,next[j]=k=2
					  2		//同上一个
					  	3//k-1 = 2, next[j] = 3 
					  	  1 1 2  3  4  5  6  7  1  1

	  	 
int Index_KMP(SString S, SString S, int pos){
    
    
	i = pos, j =1;
	
	while(i < S.length && j < T.length){
    
    
		if(j == 0 || S.ch[i] == T.ch[i]) {
    
    i++; j++;}
		else{
    
     j = next[j];}				//与BF算法相比,*i不变,j按照next后退 
	}
	if(j > T.length)	return i-T.length;	//匹配成功
	else return 0;		//返回不匹配标志 
} 

求next数组 
void get_next(SString T, int &next[]){
    
    
	i = 1;next[1] =  0;j = 0;
	while(i<T.length){
    
    
		if(i == 0 || T.ch[i] == T.ch[j]){
    
    
			++i,++j;
			next[i] = j;
		}else	j = next[j];
	} 
} 
  

改善:nextval
s:aaabaaaab
p:aaaabaaab
i = 4
next [j]バックトラッキングに従ってjを移動しない、j = 3は同じではない、j = 2は同じではない、j = 1は同じではない、次にi + 1

ここに画像の説明を挿入

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/fly_ship/article/details/109348202