您的位置:首页 > 其它

模式匹配算法--朴素算法

2013-09-16 10:19 169 查看
1.朴素的模式匹配算法。

朴素模式匹配算法,简单的说就是循环把主串的每个字符作为开头,与子串去进行匹配。对主串做大循环,每个字符为开头做子串(要匹配的字符串)的小循环,如果对应字符匹配,则两字符串都向后移位,否则子串又从子串的开头开始与主串前一步比较的字符开头的下一位继续匹配,直到匹配成功或(主串)遍历完成。

比如主串为“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模式匹配算法要讲的内容会比较多,为了不至于影响阅读的心情,加重阅读的负担,放到另一篇文章里面介绍
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: