原创作品,出自 “晓风残月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),最高可提高机器字长位的速度。