ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

字符串匹配--“RK”算法实现

2021-11-22 14:02:01  阅读:171  来源: 互联网

标签:主串 hash -- pattern 模式 int 算法 str RK


public static int rabinKarp(String str, String pattern){
    //主串长度
    int m = str.length();
    //模式串的长度
    int n = pattern.length();
    //计算模式串的hash值
    int patternCode = hash(pattern);
    //计算主串当中第一个和模式串等长的子串hash值
    int strCode = hash(str.substring(0, n));

    //用模式串的hash值和主串的局部hash值比较。
    //如果匹配,则进行精确比较;如果不匹配,计算主串中相邻子串的hash值。
    for (int i=0; i<m-n+1; i++) {
        if(strCode == patternCode && compareString(i, str, pattern)){
            return i;
        }
        //如果不是最后一轮,更新主串从i到i+n的hash值
        if(i<m-n){
            strCode = nextHash(str, strCode, i, n);
        }
    }

    return -1;
}

private static int hash(String str){
    int hashcode = 0;
    //这里采用最简单的hashcode计算方式:
    //把a当做1,把b当中2,把c当中3.....然后按位相加
    for (int i = 0; i < str.length(); i++) {
        hashcode += str.charAt(i)-'a';
    }
    return hashcode;
}

private static int nextHash(String str, int hash, int index, int n){
    hash -= str.charAt(index)-'a';
    hash += str.charAt(index+n)-'a';
    return hash;
}

private static boolean compareString(int i, String str, String pattern) {
    String strSub = str.substring(i, i+pattern.length());
    return strSub.equals(pattern);
}

public static void main(String[] args) {
    String str = "aacdesadsdfer";
    String pattern = "adsd";
    System.out.println("第一次出现的位置:" + rabinKarp(str, pattern));
}

标签:主串,hash,--,pattern,模式,int,算法,str,RK
来源: https://blog.csdn.net/m0_37644587/article/details/121400730

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有