字符串匹配算法-Shift And算法

原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

由于各种原因,可能存在诸多不足,欢迎斧正!      

     我目前熟悉的字符串匹配算法有BF算法、KR算法、KMP算法、自动机算法。其中KMP算法、自动机算法用在模式串较短的时候有

一定的浪费且二者实现起来有一定的难度。在这种情况下,即模式串较短的情况下可以选择shift and算法。

       shift and算法是一种基于模式串前缀的字符串匹配算法。该方法与计算机的位数相关,通常计算机为32位,故一般情况下适合处理

模式串长度在32以内的。设集合Set记录这所有模式串W的前缀是当前处理的主串T部分的后缀的信息。没处理完一个主串字符,都要修改Set.

       二进制位操作+BF算法

       贴段Java代码。

import java.util.Scanner;


public class Shift_And {
	static Scanner input=new Scanner(System.in);
	
	//Shift And算法
	static int Shift_And_Mathch(String word,String text)
	{
		int []Index=new int[256+10];
		
		//预处理模式串过程
		for(int i=0;i<word.length();i++)
		{
			Index[word.charAt(i)]|=(0x01<<i);
		}
		int npos=0;//当前主串的下标
		int Set=0;//记录word的前缀同时是text的后缀
		int tag=1<<(word.length()-1);
		
		while(npos<text.length())
		{
			//函数是字符相同且位置一致,Set的最高位1反应了模式串的最大匹配长度
			Set=((Set<<1)|(0x01))&Index[text.charAt(npos)];
			if((Set&tag)!=0)//匹配成功模式串的最高位
			{
				return npos-(word.length()-1);
			}
			npos++;
		}
		return -1;
	}
	
	public static void main(String[] str)
	{
		while(true)
		{
		String text=input.next();
		String word=input.next();	
		int ans=Shift_And_Mathch(word,text);
		System.out.println(word+"在"+text+"中首次出现在第"+ans+"个位置!");
		}
	}
}

 

          此算法的时间复杂度为O(n),最高可提高机器字长位的速度。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WM算法是一种字符串匹配算法,其全称是"Shift-And算法",也称为"Bitap算法"。该算法通过将模式串的每个字符用二进制表示,然后将这些二进制数构成一个二维矩阵,再通过按列计算的方法,将模式串的匹配转换为矩阵的匹配。在匹配的过程中,算法通过移位和与操作来快速地判断文本串中是否存在与模式串匹配的子串。 具体来说,WM算法的匹配过程分为两个步骤: 1. 预处理模式串,生成一个二维矩阵,每一列代表一个字符,每一行代表一个二进制位。矩阵中的第i行第j列的值为1,当且仅当模式串中第j个字符的二进制表示的第i位为1。 2. 在文本串中按列计算,将文本串中每个字符的二进制表示与模式串的矩阵进行"与"操作,然后将结果向左移位。如果某一列的结果等于0,则表示在文本串中不存在与该列匹配的字符。如果某一列的结果包含1,则表示在文本串中可能存在与该列匹配的字符。通过对每一列进行"与"操作和移位,最终可以得到文本串中所有可能与模式串匹配的位置。 WM算法的时间复杂度为O(mn/w),其中m为模式串的长度,n为文本串的长度,w为计算机中一个字(word)的位数。相比于其他的字符串匹配算法,WM算法的优点在于:不需要使用哈希函数,可以适用于任何字符集,且可以处理模式串中包含通配符的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值