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

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模式匹配算法要讲的内容会比较多,为了不至于影响阅读的心情,加重阅读的负担,放到另一篇文章里面介绍

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值