一、字符串查找:
1、在Word、 IntelliJ IDEA、Codeblocks等编辑器中都有字符串查找功能。
2、字符串查找算法是一种搜索算法,目的是在一个长的字符串中找出是否包含某个子字符串。
二、字符串匹配:
1、一个字符串是一个定义在有限字母表上的字符序列。
例如,ATCTAGAGA是字母表 E ={A,C,G,T}上的一个字符串。
2、字符串匹配算法就是在一个大的字符串T中搜索某个字符串P的所有出现位置。
其中,T称为文本,P称为模式,T和P都定义在同一个字母表E上。
3、字符串匹配的应用包括信息检索、拼写检查、语言翻译、数据压缩、网络入侵检测。
三、字符串查找与匹配算法:
1、朴素查找算法(Naive string search algorithm)
2、KMP算法(Knuth-Morris- -Pratt algorithm)
3、BM算法(Boyer-Moore string search algorithm)
问题: (一)朴素查找算法: 2、求解方法:假定当前匹配中,文本T匹配到i位置,模式P匹配到j位置,则: 3、求解分析: (1)开始时,i=0, j=0 (2)接下来,i=1,j=0 (3)接下来,i=2,j=0 (4)接下来,i=4,j=0 (5)接下来,i=5,j=1 (6)接下来,i=10, j=6 (7)接下来,i=5, j=0 (8)接下来,i=10, j=2 (9)接下来,i=17, j=6 (10)接下来,i=15, j=0 (11)接下来,i=21, j=6 算法性能:时间复杂度是0(m(n-m+1))=O(mn)
给定一个文本T字符串和一个模式P字符串, 查找P在T中的位置。
记号:
m、n:分别表示T和P的长度。
E:T和P的字符都定义在同一个字母集E上。
Ti、Pj: T的第i个字符和P的第j个字符(以0起始)。其中0≤i
1、求解原理:使用暴力匹配(Brute Force algorithm) 的思路。
B B C A B C D A B A B C D A B C D A B D E
A B C D A B D
①如果当前字符匹配失败(称为失配,即T[i] != P[j]),令
i=i-(j-1), j=0, 即每次失配时,i要回溯,j被置为0。
②如果当前字符匹配成功(即T[i] == P[j]),则i++, j++,继续匹配下一个字符;
③若j≥n,则T包含P一次,匹配位置=i-j。
T[0]为B,P[0]为A, 失配。执行①:即T[i]!=P[j]时, i=i-(j-1), j=0。
因此,i=0-(0-1)=1, j=0。
T[1]为B,P[0]为A, 失配。执行①:即T[i]!=P[j]时, i=i-(j-1), j=0。
因此,i=1-(0-1)=2, j=0。
T[2]为C,P[0]为A, 失配。执行①:即T[i]!=P[j]时, i=i-(j-1), j=0。
因此,i=1-(0-1)=3, j=0。 ...
T[4]为A,P[0]为A, 匹配。执行②:即T[i]==P[j]时, i++, j++。
因此,i=5, j=1。
T[5]为B,P[1]为B, 匹配。执行②:即T[i]==P[j]时, i++, j++。
因此,i=6, j=2。
T[10]为空格,P[6]为D,失配。执行①:即T[i]!=P[j]时, i=i-(j-1), j=0。
因此,i=10-(6-1)=5, j=0。
T[5]为B,P[0]为A, 失配。执行①:即T[i]!=P[j]时, i=i-(j-1), j=0。
因此,i=5-(0-1)=6, j=0。
T[10]为空格,P[2]为C,失配。执行①:即T[i]!=P[j]时, i=i-(j-1), j=0。
因此,i=10-(2-1)=9, j=0。.....
T[17]为C,P[6]为D,失配。执行①:即T[i]!=P[j]时, i=i-(j-1), j=0。
因此,i=17-(6-1)=12, j=0。.....
T[15]为A,P[0]为A, 匹配。执行②:即T[i]==P[j]时, i++, j++。
因此,i=16, j=1。
T[21]为D,P[6]为D,匹配。执行②:即T[i]==P[j]时, i++, j++。
因此,i=22, j=7。此时j≥n,执行③:T包含P一次,匹配位置=i-j=15。
算法特点:每次比较总是从起点开始,即T的下一个字符、P的起始字符。