第四章:串
1、串的概述
串:即字符串,是由0个或多个字符组成的有限序列,一般记为 S=‘abcdefg’(n>=0)
当串的长度为0时为空串。
字串的概念:
串是一种特殊的线性表,数据元素之间呈线性关系。
串的数据对象为限定的字符集(如中文字符、英文字符、数字字符、标点字符等),串的基本操作一般以字串为操作对象。
串的大小比较:从第一个字符开始向后面一次对比,先出现更大的字符的串更大。长串前缀与短串相等时,长串更大。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qDzguiu4-1624854212603)(C:\Users\yu\AppData\Roaming\Typora\typora-user-images\image-20210622224702269.png)]
2、串的存储结构
1、串的顺序存储(静态数组,动态数组)
1、串的存储方案
方案二的缺点:char[0]占1个字节(0~255),如果数组长度更大则表示不了。
方案一的缺点:位序和和索引不对应。
综合考虑:方案四更佳。
2、串的链式存储
3、字符串的模式匹配
串的匹配:在主串中寻找完全匹配字串,并返回位置。
普通的定位操作(朴素匹配模式):
用k记录i的初始位置以便于回溯,双指针 i和j,i为主串S的指针,j为字串T的指针,刚开始k=1,i=k,j=1。
4、KMP算法(由朴素模式匹配算法优化而来)
KMP算法:只让子串的的定位指针回溯,主串的定位指针不回不回溯,字串指针由next[j]数组决定。
public int KMP1(String S,String T,int[] next)
{
int i=0;
int j=0;
while(i<S.length() && j<T.length())
{
if(j==-1 || S.charAt(i)==T.charAt(j))
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j>=T.length())
{
return i-T.length();
}
else
{
return -1;
}
}
5、next[]数组的求法
next[j]代表当字串串匹配到j位置时匹配不上(前面的全匹配上了),应该让j回溯的位置。
public int[] getNext(String T)
{
int i=0;
int j=-1;
int[] next=new int[T.length()];
next[0]=-1;
while (i<T.length()-1)
{
if(j==-1 || T.charAt(i)==T.charAt(j))
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
return next;
}