Cadena coincidente --- algoritmo rabinkarp (java)

Idea básica:
(1) Utilizando la idea hexadecimal, realice la operación hexadecimal en la cadena del patrón para obtener un resultado. (En este ejemplo, use 31 hexadecimales)
(2) Haga un bucle en la cadena original, use la idea de rodar hash para resolver el valor correspondiente de cada elemento de la misma manera, y almacénelo en una matriz, y finalmente recupere la matriz Puede obtener el resultado.

    具体解释看代码注释
import java.util.Arrays;
import java.util.Scanner;
public class Rabinkaro {
//字符串匹配算法之 rabinkarp(利用滚动的hash降低时间复杂度)
//利用进制思想 将模式串进行编码,而后将原串进行相同的编码,一致即可判定
 //此方法用于求解幂运算
 static int mi(int a,int b)
 {
  if(b==0)
   return 1;
  int sum=1;
  for(int i=1;i<=b;i++)
   sum*=a;
  return sum;
 }
 //此方法用于计算哈希值(取为31进制)
    static int hash(String a)
     {
     int sum=0;
       for(int i=a.length()-1;i>=0;i--)
       {
        sum+=a.charAt(i)*mi(31,Math.abs(a.length()-1-i));
       }
     return sum;
    }
    //此方法用于输出匹配结果
    static void match(String yc,String msc)
    {
     int a=msc.length();//模式串的长度
     int b=yc.length();//原串的长度
     if(a>b)
      System.out.println("无法匹配");
     int c=hash(msc);//记录模式串所产生的哈希值
     int []d=new int[b];//用于记录原串所产生的哈希值
     String temp=yc.substring(0,a);//先求出第一个子串的结果
     d[0]=hash(temp);
     for(int i=1;i+a<b;i++)//循环求出其他串的结果
     {
      //前一个串*31+新增的串-前一个串的第一位的31的a次幂
      d[i]=(int) (d[i-1]*31+(int)yc.charAt(i+a-1)-(int)yc.charAt(i-1)*mi(31, a));
     }
     String last=yc.substring(yc.length()-a,yc.length());//处理最后一个子串
     d[b-2]=hash(last);
     for(int i=0;i<=d.length-1;i++)//从原串hash数组中检索即可得出结果
     {
      if(d[i]==c)
       System.out.println(i);
     } 
    }
    public static void main(String[] args) {
    Scanner a=new Scanner(System.in);
    String yc=a.nextLine();
    String msc=a.nextLine();
    match(yc,msc);
 }
}

Resultado de la operación

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Publicado 14 artículos originales · elogiado 0 · visitas 244

Supongo que te gusta

Origin blog.csdn.net/lianggege88/article/details/105097425
Recomendado
Clasificación