模式匹配算法--朴素算法
2013-09-16 10:19
169 查看
1.朴素的模式匹配算法。
朴素模式匹配算法,简单的说就是循环把主串的每个字符作为开头,与子串去进行匹配。对主串做大循环,每个字符为开头做子串(要匹配的字符串)的小循环,如果对应字符匹配,则两字符串都向后移位,否则子串又从子串的开头开始与主串前一步比较的字符开头的下一位继续匹配,直到匹配成功或(主串)遍历完成。
比如主串为“googldgfegogegoogleglgoogegooglegoo”,子串为“google”。首先从主串头字符‘g’开始与子串匹配,接下来的1,2,3,4都与子串匹配,但第5位不匹配,于是又以主串的下一个字符‘o’开始,与子串匹配。一直这样循环下去。下面第一个程序是找到主串与子串有无子串匹配,若有,返回匹配时,子串第一个字符位于主串中的位置,若无匹配,返回-1。
1)找到主串与子串有无子串匹配,若有,返回匹配时,子串第一个字符位于主串中的位置,若无匹配,返回-1。
2)找出子串在主串中出现的次数
上面的程序在找到有匹配后就立马推出循环,说明只能找到第一个匹配,也就是是否有匹配成功,下面的程序能够实现找到所有匹配的情况,并返回匹配成功次数
2.KMP模式匹配算法
朴素模式匹配算法的最大问题就是太低效了。于是三位前辈发表了一种KMP算法,其中三个字母分别是这三个人名的首字母大写。
KMP模式匹配算法要讲的内容会比较多,为了不至于影响阅读的心情,加重阅读的负担,放到另一篇文章里面介绍
朴素模式匹配算法,简单的说就是循环把主串的每个字符作为开头,与子串去进行匹配。对主串做大循环,每个字符为开头做子串(要匹配的字符串)的小循环,如果对应字符匹配,则两字符串都向后移位,否则子串又从子串的开头开始与主串前一步比较的字符开头的下一位继续匹配,直到匹配成功或(主串)遍历完成。
比如主串为“googldgfegogegoogleglgoogegooglegoo”,子串为“google”。首先从主串头字符‘g’开始与子串匹配,接下来的1,2,3,4都与子串匹配,但第5位不匹配,于是又以主串的下一个字符‘o’开始,与子串匹配。一直这样循环下去。下面第一个程序是找到主串与子串有无子串匹配,若有,返回匹配时,子串第一个字符位于主串中的位置,若无匹配,返回-1。
1)找到主串与子串有无子串匹配,若有,返回匹配时,子串第一个字符位于主串中的位置,若无匹配,返回-1。
public class PatternMatch { public static void main(String args[]) { int pos; String source="googldgfegogegoogleglgoogegooglegoo"; String subStr="google"; pos=patternMatch(source, subStr); System.out.println(pos); } /** Returns 子串在主串中第一次出现的位置 * @param source 主串 * @psrsm subStr 子串 */ static int patternMatch(String source,String subStr) { int len1,len2; len1=source.length(); len2=subStr.length(); int i,j,k;//i:主串中字符的位置(下标);j:子串中字符的位置;k:保存与子串匹配的下一个循环开头的字符的位置 i=j=k=0; while(i<len1&&j<len2) { /* * 如果字符匹配,则接着比较下一对应的字符。否则,子串要从头(j=0)开始与主串的前一个“开头”的下一位(k++)开始比较 */ if(source.charAt(i)==subStr.charAt(j)) { i++; j++; }else { k++; j=0; i=k; } } if(j==len2)//说明匹配成功 return k; else return -1; } }
2)找出子串在主串中出现的次数
上面的程序在找到有匹配后就立马推出循环,说明只能找到第一个匹配,也就是是否有匹配成功,下面的程序能够实现找到所有匹配的情况,并返回匹配成功次数
public class PatternCount { public static void main(String args[]) { int matchTimes; String source="googldgfegogegoogleglgoogegooglegoo"; String subStr="google"; matchTimes=patternNumber(source, subStr); System.out.println(matchTimes); } /** Returns 匹配成功次数 * @param source 主串 * @psrsm subStr 子串 */ static int patternNumber(String source,String subStr) { int number=0; int len1,len2; len1=source.length(); len2=subStr.length(); int i,j,k; i=j=k=0; while(i<len1) { if(source.charAt(i)==subStr.charAt(j)) { i++; j++; }else { k++; j=0; i=k; } if(j==len2){ number++; j=0; } } return number; } }
2.KMP模式匹配算法
朴素模式匹配算法的最大问题就是太低效了。于是三位前辈发表了一种KMP算法,其中三个字母分别是这三个人名的首字母大写。
KMP模式匹配算法要讲的内容会比较多,为了不至于影响阅读的心情,加重阅读的负担,放到另一篇文章里面介绍
相关文章推荐
- 【原创】朴素的模式匹配和改进的模式匹配(KMP)算法说明(草稿)
- (串的模式匹配4.6.1)POJ 3080 Blue Jeans(使用朴素的模式匹配算法求最长的公共子串)
- 字符串模式匹配算法之一:朴素模式匹配算法
- 朴素的字符串模式匹配算法
- C/C++——朴素的模式匹配算法和KMP模式匹配算法
- 朴素的和KMP模式匹配算法
- 串的模式匹配算法(一)—朴素的模式匹配算法
- 字符串-朴素的模式匹配算法
- 数据结构——串的朴素模式和KMP匹配算法
- 朴素的模式匹配和改进的模式匹配(KMP)算法说明
- 模式匹配朴素算法习题 算法导论P559
- 朴素的模式匹配(布鲁特-福斯算法)
- 数据结构——串的朴素模式和KMP匹配算法
- 串的操作(一) BruteForce (BF)算法 朴素的模式匹配
- 数据结构——串的朴素模式和KMP匹配算法
- 朴素模式的匹配算法-顺序
- 朴素的模式匹配算法
- BF算法(朴素的模式匹配算法)
- 顺序串的模式匹配 朴素算法
- (11)串的模式匹配:朴素的模式匹配算法,KMP算法