数据结构 第四章 字符串(串)

目录

4.1 串的基本概念

4.2 串的类型定义、存储结构及运算

顺序存储

链式存储

串的模式匹配算法

BF算法:

KMP算法


4.1 串的基本概念

(String)----零个或多个字符组成的有限序列

4.2 串的类型定义、存储结构及运算

ADT String{
    数据对象;   
    数据关系;
    基本操作
     (1)  StrAssign (&T,chars)                //串赋值
     (2) StrCompare (S,T)                      //串比较
     (3) StrLength (S)                             //求串长
     (4) Concat(&T,S1,S2)                     //串联            
     (5) SubString(&Sub,S,pos,len)     //求子串
     (6) StrCopy(&T,S)                       //串拷贝
     (7) StrEmpty(S)                           //串判空
     (8) ClearString (&S)                   //清空串
     (9)  Index(S,T,pos)                     //子串的位置
     (11) Replace(&S,T,V)                //串替换
     (12) StrInsert(&S,pos,T)            //子串插入
     (12) StrDelete(&S,pos,len)        //子串删除
     (13) DestroyString(&S)             //串销毁

}

顺序存储

typedef struct{
   char *ch;      //若串非空,则按串长分配存储区,
                  //否则ch为NULL
   int  length;   //串长度
}HString;

链式存储

优点:操作方便

缺点:存储密度较低

存储密度=串值所占的存储位/实际分配的存储位

可将多个字符存放在一个结点中,以克服其缺点

#define CHUNKSIZE 80       //可由用户定义的块大小
typedef struct Chunk{
   char  ch[CHUNKSIZE];
   struct Chunk *next;
}Chunk;

typedef struct{
   Chunk *head,*tail;      //串的头指针和尾指针
   int curlen;             //串的当前长度
}LString;
                                   

串的模式匹配算法

BF算法:

#include <bits/stdc++.h>
using namespace std;
int BF(string s, string t)
{
    int sl = s.length();
    int tl = t.length();
    int pos = 0;
    for(int i = 0; i<s.length(); i++)
    {
        if(s[i] == t[pos])
        {
            if(pos == tl-1)
                return i-pos;
            pos++;
        }
        else
        {
            i -= pos;
            pos = 0;
        }   
    }
    return -1;
}
int main()
{
	string s,t;
	s = "ABCD";
	t = "CD";
	cout<<BF(s,t)<<endl;
}

KMP算法

 
#include<bits/stdc++.h>
 
using namespace std;
 
const int maxn = 206;
 
int next[maxn];
 
void ca_next(string str, int len){
    int k = -1;next[0] = -1;//-1表示不存在最大公共前缀后缀,方便后面的访问
    for (int i = 1; i < len; i++){
        while (k > -1 && str[k + 1] != str[i])  k = next[k];
        if (str[k + 1] == str[i])   k++;
        next[i] = k;
    }
}
 
int KMP(string ts, string ps){
    int ts_len = ts.size(),ps_len = ps.size();
    ca_next(ps, ps_len);
    int k = -1;
    for (int i = 0; i < ts_len; i++){
        while (k >-1 && ps[k + 1] != ts[i])  k = next[k];
        if (ps[k + 1] == ts[i])   k++;
        if (k == ps_len - 1)  return i - ps_len + 1;
    }
    return -1;
}
 
int main(){
    string s = "ABCDABABGFABAC";
    string p = "ABAB";
    cout<<KMP(s,p)<<endl;
    return 0;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值