数据结构与算法----串

本文介绍了字符串的基本操作,如赋值、复制、判断空、求长度等,并讨论了顺序存储结构,包括静态和动态数组以及链式存储的不同实现。文章还涉及了模式匹配算法,如朴素算法和更高效的KMP算法,以及如何计算KMP模式串的next数组。
摘要由CSDN通过智能技术生成

字符串是由零个或多个字符组成的有限序列。

基本操作

StrAssign(&T,chars):赋值操作。

StrCopy(&T,S):复制操作。

StrEmpty(S):判空操作。

StrLength(S):求串长。

Clear String(&S):清空操作。

Destroy String(&S):销毁串。

Concat(&T,S1,S2):串连接。

SubString(&Sub,S,pos,len):求子串。用Sub返回串S的第pos个字符起长度为len的子串。

bool SubString(SString &Sub,SString S,int pos,int len){
    //子串范围越界
    if(pos+len-1>S.length)
        return false;
    for(int i=pos;i<pos+len;i++)
        Sub.ch[i-pos+1]=S.ch[i];
    Sub.length = len;
    return true;
}

Index(S,T):定位操作。若主串中存在与串T值相同的子串,则返回他在主串S中第一次出现的位置;否则函数值为0;

int index(SString S,SString T){
    int i=1 , n=StrLength(S), m=StrLength(T);
    SString sub;
    while(i<=n-m+1){
        SubString(sub,S,i,m);
        if(StrCompare(sub,T)!=0) ++i;
        else return i;
    }
    return 0;
}

StrCompare(S,T):比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0;

int StrCompare(SString S,SString T){
    for(int i=1;i<=S.length && i<=T.length;i++){
        if(S.ch[i]!=T.ch[i])
            return S.ch[i]-T.ch[i];
    }
    return S.length-T.length;
}

存储结构

顺序存储

静态数组,动态数组

1.在链表末尾加上一个变量length;

2.在链表表头加一个ch[0]作为length,但是只能存储0-255字节的字符串。

3.没有length,以字符’/0‘表示结尾。

链式存储

可让每个结点存多个字符,没有字符的位置用’#‘或'\0'补足

模式匹配算法

朴素模式匹配算法-O(nm)

int Index(SString S,SString T){
    int i=1,j=1;
    while(i<=S.length && j<=T.length){
        if(S,ch[i]==T.ch[j]){
            ++i,++j;
        }
        else{
            i=i-j+2;
            j=1;
        }
    }
    if(j>T.length)
        return i-T.length;
    else
        return 0;
}

KMP算法-O(m+n)

int Index_KMP(SString S,SString T,int next[]){
    int i=1,j=1;
    while(i<S.length&&j<T.length){
        if(j==0||S.ch[i]==T.ch[j]){
            ++i;
            ++j;
        }
        else{
            j=next[j];
        }
    }
    if(j>T.length)
        return i-T.length;
    else 
        return 0;   
}
  • 求模式串的next数组

    • next[1]无脑写0;

    • next[2]无脑写1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值