一、字符串
1.字符串的出现
- 计算机发明初期,计算机主要用于做一些科学和工程的计算;
- 而且刚开始计算机都是用来处理数值型的数据,后来引入了字符串的概念,计算机才开始进行非数值型数据的处理(其原理仍然是通过数值来模拟非数值,比如ASCII码表);
ASCII码表
2.“字符串”的数据结构
- 定义:串(String)是由零个或多个字符组成的有限序列,又名叫字符串;
- 一般记为 s = "a1a2a3......an" (n>=0)
- 串可以是空串,即没有字符,直接由""表示(注意里边没有空格哦!,因为空格也是有ASCII码,其值为32),或者可以用希腊字母φ表示(读fai,四声);
- 字串与主串,例如"over"是"Lover"的字串,反之则倒过来;
3.字符串的比较
- 字符串比较大小跟传统的数字比较有所差别,我们很容易知道2比1大,可是要比较"Over"和"Lover"要如何比较呢?比长短还是比大小呢?
- 比大小,比的就是字符串里每个字符的ASCII码的大小,因为'O' == 79,'L' == 76,'O' >'L',所以"Over" > "Lover";
- 其实这样的比较大小意义不大,字符串的比较我们更重视是否相等。
4.字符串的存储结构
- 字符串的存储结构与线性表相同,也分为顺序存储结构和链式存储结构;
- 字符串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的;
- 按照预定义的大小,为每个定义的字符串变量分配一个固定长度的存储区,一般用定长数组来定义;
- 与线性表相似,既然是固定长度的存储区,就存在一个空间分配不灵活的问题,那么会考虑用链式存储结构。
5.BF(Brute Force)算法
BF算法属于朴素的模式匹配算法,它的核心思想是:
- 有两个字符串S和T,长度为N和M。首先S[1]和T[1]比较,若相等,则再比较S[2]和T[2],一直到T[M]为止;若S[1]和T[1]不等,则T向右移动一个字符的位置,再依次进行比较;
- 该算法最坏情况下要进行M*(N-M+1)次比较,时间复杂度为O(M*N );
- 在这里S是主串,T是子串,这种字串的定位操作通常称作串的模式匹配;
例如:我们要从主串S = "ILoveJava"找到 T = "Java"这个子串的位置,按照BF算法,我们需要进行下边的步骤:
- 首先将T[1]的'J'与S[1]的'I'进行比较;
- 不相等,则将T[1]的'J'与S[2]的'L'进行比较;
- 仍不相等,则将T[1]的'J'与S[3]的'O'进行比较;
- ......
- 直到出现第一个相等的位置之后,就依次比较,然后就可以找到"Java"这个子串。
6.代码实现BF算法
// 返回子串T在主串S中第pos个字符之后的位置
// 若不存在,则返回0
// T非空,1 <= pos <= strlen(S)
// 注意:我们这里为了表述方便,字符串使用了第一个元素表示长度的方式。
int index( String S, String T, int pos ){
int i = pos; // i用于主串S中当前位置下标
int j = 1; // j用于子串T中当前位置下标
while( i <= S[0] && j <= T[0] ){ // i或j其中一个到达尾部即终止搜索!
if( S[i] == T[i] ){ // 若相等则继续下一个元素匹配
i++;
j++;
}else { // 若失配则j回溯到第一个元素从新匹配
i = i-j+2; // i回溯到上次匹配首位的下一个元素,这是效率低下的关键!
j = 1;
}
}
if( j > T[0] ){
return i - T[0];
}else {
return 0;
}
}
本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!