字符串匹配算法
一、Brute-Force模式匹配算法
实现方法:设s为主串,t为模式串,i为主串当前比较字符的下标,j为模式串当前比较字符的下标。令I的初始值为strat,j的初始值为0。从主串的第start个字符起和模式串的第一个字符相比较(j=0),若相等,则继续比较后续的字符(i++,j++),否则从主串的第二个字符起重新比较,依次类推,直至模式串t中的每一个字符依次和主串s的一个连续的字符序列相等,则匹配成功,函数返回模式串t的第一个字符在主串中的位置,否则匹配失败,返回-1.
代码如下(示例):
package _01字符串匹配算法;
import java.util.Scanner;
public class Brute_Force {
public static void main(String[] args) {
String s=new String();
String t=new String();
Scanner sc=new Scanner(System.in);
System.out.println("请输入第一个字符串");
s=sc.next();
System.out.println("请输入需要匹配的字符串");
t=sc.next();
System.out.println(indexOf_BF(s,t));
}
public static int indexOf_BF(String s, String t)
{
int slen=s.length();
int tlen=t.length();
if(slen>0&&tlen>0&&slen>=tlen)
{
int i=0,j=0;
while((i<slen)&&(j<tlen))
{
if(s.charAt(i)==t.charAt(j))
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j==t.length())
{
return i-tlen;
}
else return -1;
}
return 0;
}
}
二、KMP算法
1.求next
package _01字符串匹配算法;
import java.util.Scanner;
/*
*/
public class NextDemo {
public static int[] getNext(String s)
{
int j=0;
int len=s.length();
int[] next=new int[len];
next[0]=0;
for(int i=1;i<len;i++)
{
while(j>0&&s.charAt(i)!=s.charAt(j))
{
j=next[j-1];
}
if(s.charAt(i)==s.charAt(j))
j++;
next[i]=j;
}
return next;
}
public static void main(String[] args) {
System.out.println("请输入匹配字符串");
Scanner sc=new Scanner(System.in);
String s=sc.next();
int[] next = getNext(s);
for (int i = 0; i < next.length; i++) {
System.out.print(next[i]);
}
}
}
2.KMP完整版
package _01字符串匹配算法;
import org.w3c.dom.ls.LSOutput;
import java.util.Scanner;
public class KMPDemo {
public static int[] getNext(String s)
{
int j=0;
int len=s.length();
int[] next=new int[len];
next[0]=0;
for(int i=1;i<len;i++)
{
while(j>0&&s.charAt(i)!=s.charAt(j))
{
j=next[j-1];
}
if(s.charAt(i)==s.charAt(j))
j++;
next[i]=j;
}
return next;
}
public static int index(String s, String t)
{
int start=0;
int end=0;
int[] next2=getNext(t);
while(start<s.length()&&end<t.length())
{
if(end>0&&s.charAt(start)!=t.charAt(end))
{
end=next2[end-1];
}
else
{
start++;
end++;
}
}
if(end<t.length())
return -1;
else
return(start-t.length());
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入主字符串");
String s=sc.next();
System.out.println("请输入匹配字符串");
String t=sc.next();
int[] next = getNext(t);
int index = index(s, t);
System.out.println(index);
}
}