程序员社区

数据结构(串)

串的概念

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

  • 串中字符数目n称为串的长度
  • 零个字符的串称为空串

字符的表示

  1. 计算机中常用的字符是由ASCII编码
  2. 开始是由7位二进制数表示一个字符,总共可表示128个字符
  3. 后来由于特殊符号的出现,扩展了ASCII码,由8位二进制数表示一个字符,可以表示256个字符
  4. 后来又有了Unicode码,比较常用的是16位二进制数表示一个字符,可以表示约6.5万多个字符
  5. 为了和ASCII码兼容,Unicode码的前256个和ASCII码一样

 

字符串的比较

给定俩个串,s(长度n),t(长度m),满足n<m且ai=bi时s<t

存在某个k<=min(m,n)  使得ai=bi ak<bk 所以s<t

 

index朴素的模式匹配算法

String s;
String T;
String sub;
int n,m,i;
n=StrLength(S);
m=StrLength(T);    //求字符串长度
while(i<=n-m+1){
    SubString(sub,S,i,m);   //取子串
    if(StrCompare(sub,T)!=0);  //比较
    ++i;
    else
return i;
}

KMP模式匹配算法

大大避免重复遍历的情况

原理

j 123465
模式串T abcabx
next[j] 011123

如果前后缀一个字符相等,k=2,n个相等,k=n+1

通过计算返回子串的next数组

void get_next(string T,int *next){
    int i,j;
    i=1;j=1;
    next[1]=0;
    while(i<T[0]){
           if(j==0||T[i]==T[j]){
                ++i;
                ++j;
                next[i]=j;
        }
         else
               j=next[j];
    }
}

计算出当前要匹配的串T的next数组

int Index_KMP(string s,string T,int pos){
    int i=pos;   //主串s当前位置下标
    int j=1;
    int next[255];
    get_next(T,next);
    while(i<S[0]&&j<=T[10]){
        if(j==0||s[i]==T[j]){
            ++i;
            ++j;
        }
        else{
            j=next[j];  
        }
    } 
    if(j>T[10]){
        return i-T[0];
    }
    else 
    return 0;
}

 

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 数据结构(串)

一个分享Java & Python知识的社区