串
串的逻辑结构和线性表相似,不过串的数据类型是字符。在串的基本操作中,通常以一个串作为操作对象。
基本概念
①当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的。
②一个串中任意个连续字符组成的子序列(含空串,但不含串本身)称为该串的子串。
例如,“a”、“ab”、“ab”都是“abc”的子串。
串的存储结构
①行结构
以一个定长的数组进行存储,0号位置存储串长
②堆结构
若是非空串,则按串长分配存储区,否则指针指向为NULL
③块链存储结构
串值也可用链表来存储,由于串的数据元素是一个字符,因此用链表存储时,通常一个结点中存放的不是一个字符,而是若干个字符
串匹配的简单算法
Brute-Force(BF)算法,又称简单匹配算法、平凡算法
问题描述:
存在两个串,主串,子串,要在主串中匹配到子串的位置
算法描述:
从主串和子串的开头部分进行比较。若两者相等,则同时向后遍历,若能够匹配到子串结尾,则表示匹配成功,记录位置。若在比较过程中,两者不等,则主串回溯为匹配开始的下一位,子串重置,重新开始匹配。
具体实现:
/**
* 使用bf算法将字串与主串进行匹配
* @param main 主串(由于java的char类型无法存储串长,首位未存放值)
* @param son 字串
* @return 匹配到的位置(不成功返回0)
*/
public static int countLocate(char main[],char son[]) {
//提前记录长度,减少比较时的运算量
int maLength = main.length;
int soLength = son.length;
for(int i=1; i< maLength; i++) {
for(int j=1; j< soLength; j++) {
if(main[i] != son[j]) {
//不相等,主串回溯,跳出此层循环
i=i-j+1;
break;
}
if(j == soLength-1) {
//匹配到了子串尾部,匹配成功
return i-j+1;
}
i++;
if(i > maLength-1) {
//先加一,再判断,可避免"av"和 "avvvvv"匹配成功
return 0;
}
}
}
return 0;
}
结果: