栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

1044. 最长重复子串

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1044. 最长重复子串

字符串哈希学习

h[i] = h[i-1] * p + s[i];
p[i] = p[i - 1] * p;
hashNum = h[i + len] - h[i] * p[len];

可以用字符串哈希来写
  1. 且仅当两个哈希值溢出程度与 Integer.MAX_VALUE 呈不同的倍数关系时,会产生错误结果(哈希冲突),此时考虑修改 或者采用表示范围更大的 long 来代替 int。

  2. int做乘法发生溢出警告,可以 * 1ll 转换成 足够大的long long 来完成乘法操作,然后强行向下转换int

  3. long long做乘法发生溢出警告,可以转换成足够大的__int128 来完成乘法操作,然后强行向下转换long long

  4. mp.clear();减少哈希冲突

C++ 代码如下

class Solution {
    // 且仅当两个哈希值溢出程度与 Integer.MAX_VALUE 呈不同的倍数关系时,会产生错误结果(哈希冲突),此时考虑修改  或者采用表示范围更大的 long 来代替 int。
    // int做乘法发生溢出警告,可以 * 1ll 转换成 足够大的long long 来完成乘法操作,然后强行向下转换int
    //131 4999 2011
   public:

    long long P = 131313,sz;
    long long h[30010],p[30010];
    unordered_map mp;
    void pre(string & s){
        h[0] = p[0] = 1;
        for(int i = 1; i <= sz; ++i){
            h[i] = ( __int128) h[i- 1] * P + s[i - 1];
            p[i] = ( __int128) p[i - 1] * P; 
        }
    }
    long long get(int i,int len){
        return h[i + len] - ( __int128)h[i] * p[len];
    }
    string longestDupSubstring(string s) {
       
        sz = s.size();
         pre(s);
        string ans = "",y;
        int l = 1,r = sz - 1,m;
        while(l <= r){
            mp.clear();//记得clear减少哈希冲突
            bool f = false;
            m = (l + r) >> 1;
            for(int i = 0; i <= sz - m; ++i){
               
                long long x = get(i,m);
                 
                if(mp.count(x)){
                    f = true;
                    ans = s.substr(i, m);
                    break;
                }else ++mp[x];
            }
            if(f)
                l = m + 1;
            else r = m - 1;
        }
        return ans;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678714.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号