字符串匹配算法

来源:互联网 发布:eclipse修改端口号 编辑:程序博客网 时间:2024/05/16 04:40

字符串的一种基本操作就是字符串查找:给定一段长度为N的文本和一个长度为M的模式(pattern)字符串,在文本中找到一个和该模式相符的字符串。

如:

模式-> needle

正文->iinshneedleeina

当你在文本编辑器或是浏览器中查找某个单词时,就是在查找字符串。字符串查找的一个经典应用就是在接货通信内容中寻找某种重要的模式。一位军队将领感兴趣的可能是在截获文本中寻找和“拂晓进攻”类似的字句。一名黑客感兴趣的可能是在内存中查找和“password”相关的内容。

以下介绍两种字符串匹配算法:

一、暴力子字符串查找算法。

基本思想:用i跟踪文本,j跟踪模式。对于每个i,首先重置为0并不断将它增大,直至找到了一个不匹配的字符或是模式介数(j==M)位置。
public class StringMatch {public int matchString(String txt, String pattern) {int N = txt.length();// 文本长度int M = pattern.length();// 模式长度for (int i = 0; i <= N - M; i++) {int j;for (j = 0; j < M; j++)if (txt.charAt(i + j) != pattern.charAt(j))break;// 找到匹配if (j == M)return i;}return N;// 未找到匹配}public static void main(String args[]) {String txt = "shiehuifhsheijid";String pattern = "she";StringMatch stringMatch = new StringMatch();System.out.println(stringMatch.matchString(txt, pattern));}}

输出:9
一种最坏的情况是文本和模式都是一连串的A接一个B。那么,对于N-M+1个可能的匹配位置,模式中的所有字符都需要和文本比对,总成本为M(N-M+1)。一般来说M远小于N,因此总的复杂度接近O(n*m)。
所以,我们需要寻求更为高效的字符串匹配方法。

二、KMP算法

晦涩难懂。。。
为什么会看这个?是在牛客网上看了一道这样的题目:

如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。比如A="12345",A的旋转词有"12345","23451","34512","45123"和"51234"。对于两个字符串A和B,请判断A和B是否互为旋转词。

给定两个字符串AB及他们的长度lenalenb,请返回一个bool值,代表他们是否互为旋转词。

测试样例:
"cdab",4,"abcd",4
返回:true
public class Rotation {public boolean chkRotation(String A, int lena, String B, int lenb) {if (lena != lenb) {return false;}String C = A + A;return C.contains(B);}public static void main(String[] args) {String A = "cdab";int lena = A.length();String B = "abcd";int lenb = B.length();Rotation rotation = new Rotation();System.out.println(rotation.chkRotation(A, lena, B, lenb));}}

输出:true

视频介绍说要用KMP,看了半天没看懂,上面的代码也通过了呀,并没有用到KMP。。。
0 0
原创粉丝点击