串的比较:
串的比较实际是串中字符的编码。
字符编码——字符在对应字符集中的序号。
ASCII编码 8位二进制 256
中文等其他语言采用:Unicode编码 16位二进制表示一个字符
1.当字符串1中的串长小于字符串2的串长,并且字符串1包含在字符串2中,则字符串1小于字符串2.
str1 = “caohai”;
str2 = “cao”;
str1>str2;
2.出去相等的字符,在第一个不相等的字符处比较其ASCAII码,谁的ASCAII码大谁就大;
str1 = “caohai”;
str2 = “caoren”;
str1>str2;
串的顺序存储结构:
串的顺序存储结构是用一组地址连续的存储空间来存储串中的字符序列。
串的匹配模式算法:
BF算法:
首先通过比较主串和子串的第一个字符是否相等如果相等则比较第二个字符,如果第二个字符相等,依次比较之后的字符。如果遇到不相等的字符,主串的下标回溯到第二个字符并与子串的第一个字符相比较,如果相等则比较主串第三个字符和子串的第二个字符,以此类推。由于主串的下标一直在变化,直到直到子串之后返回最后下标减去子串长度。
int i = pos;
int j = 1;
while(i <= sLEn && j <= tLen){
if(S[i] == T[j]){
i++;
j++;
}else{
i = i-j+2; //主串下标回溯
j = 1;
}
} //遍历查找之后如果子串的下标超过子串的长度则说明找到该子串
if(j>tLen){
return i-tLen;
}else{
return 0;
}
KMP算法:
消除重复的比较提高效率。每趟匹配过程中出现字符比较不等时,不回溯主指针i,利用已得到的部分匹配结果将模式向右滑动尽可能远的一段距离,继续进行比较。
字符串前缀:除去最后一个字符外,一个字符串的全部头部组合
字符串后缀:除去第一个字符外,一个字符串的全部尾部组合
a 前缀:无 后缀: 无
aa 前缀:a 后缀: a 最大共有长度1
aaa 前缀:a,aa 后缀: a,aa 最大共有长度2
aaaa 前缀:a,aa,aaa 后缀: a,aa,aaa 最大共有长度3
aaaac 前缀:a,aa,aaa 后缀:c,ac,aaac 最大共有长度0
void Getnext(int next[],String t)
{
int j=0,k=-1;
next[0]=-1;
while(j<t.length-1)
{
if(k == -1 || t[j] == t[k])
{
j++;k++;
next[j] = k;
}
else k = next[k];
}
}