目录
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;
}