rk字符串匹配算法java实现


/**
 * rk字符串匹配算法,主要引入了hash的概念,
 * 利用子串的hash值依次对比主串相应长度的子串hash值
 * 并对hash值相同的子串进行匹配对比
 */
public class RKSearch {

    /**
     * rk算法入口
     * @param t 主字符串
     * @param p 子字符串
     * @return
     */
    public int rk(String t,String p){
        // 字符串非法判定
        if (t == null||t.length() == 0 || p == null || p.length() == 0 || p.length() > t.length()){
            return -1;
        }
        // 计算子串hash值
        int hash = hash(p,26,31,0,p.length());
        for (int i = 0;i< t.length();i++){
            // 对主串内的数字一次进行hash计算,并对比子串是否匹配
            if (hash(t,26,31,i,p.length()) == hash && match(t,p,i)){
                return i;
            }
        }
        return -1;
    }

    /**
     * 自定义hash算法
     * @param str
     * @param r 进制数
     * @param k 将字符串映射到k的范围
     * @param start 从str串的开始位置
     * @param len 子串的长度
     * @return
     */
    private int hash(String str,int r,int k,int start,int len){
        int hash = 0; // 设定hash值为0
        /**
         * 对字符串内的每个字符串进行计算
         */
        for (int i = start;i<start+len;i++){
            // 进制系数 与 hash 的积 + 每个字符与范围取余的结果
            hash = (r * hash + str.charAt(i) % k);
        }
        // 将最后的结果,映射到指定范围内
        return hash % k;
    }

    /**
     * 对于hash计算结果相同的两个子串,是否匹配的比较
     * 主要判定hash冲突情况下的匹配问题
     * @param t 主串
     * @param p 子串
     * @param i 从主串下标为i的地方开始比较
     * @return
     */
    private boolean match(String t,String p,int i){
        for (int j = 0 ; j < p.length();j++){
            if (p.charAt(j) != t.charAt(j + i)){
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        String test = "adbsasdfddddsasdffesase";
        String sub = "sd";
        RKSearch rkSearch = new RKSearch();
        int rk = rkSearch.rk(test, sub);
        System.out.println(rk);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构与算法是计算机科学非常重要的概念。在Java,有许多常见的数据结构和算法实现。其,数据结构包括数组、链表、栈、队列、跳表、散列表、二叉树、堆、图和Trie树。而算法包括递归、排序、二分查找、哈希算法字符串匹配算法。\[1\] 在Java,我们可以使用散列表(哈希表)来实现数据结构。而在字符串匹配算法,有四种常见的算法:暴力匹配算法(BF算法)、RK算法、BM算法和KMP算法。这些算法都有各自的特点和适用场景。\[2\] 另外,在Java开发,排序是一种常见的需求。我们可以使用一些常见的排序算法来对数据元素进行排序,比如按照日期对订单进行排序,按照价格对商品进行排序等等。在Java的开发工具包(JDK),已经提供了许多数据结构和算法实现,比如List、Set、Map和Math等。我们可以借鉴JDK的方式,将算法封装到某个类,并进行API的设计和实现。\[3\] 综上所述,数据结构与算法Java有着广泛的应用,通过学习和使用这些概念和实现,我们可以更好地解决问题和优化程序。 #### 引用[.reference_title] - *1* *2* [Java数据结构和算法学习笔记](https://blog.csdn.net/zth13015409853/article/details/121946203)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [数据结构与算法Java篇)笔记--Comparable接口](https://blog.csdn.net/csh1807266489/article/details/126782378)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值