首页 > 编程语言 >【LBLD】滑动窗口算法延伸:RABIN KARP 字符匹配算法

【LBLD】滑动窗口算法延伸:RABIN KARP 字符匹配算法

时间:2023-04-13 20:44:31浏览次数:38  
标签:KARP right nums int res windowHash 算法 LBLD size

滑动窗口算法延伸:RABIN KARP 字符匹配算法

187. 重复的DNA序列

普通方法:

class Solution {
public:
    vector<string> findRepeatedDnaSequences(string s) {
        int n = s.size();
        unordered_set<string> seen;
        unordered_set<string> res;
        
        for (int i = 0; i + 10 <= n; i++) {
            string subStr = s.substr(i, 10);
            if (seen.count(subStr)) {
                res.insert(subStr);
            }
            else {
                seen.insert(subStr);
            }
        }
        return vector<string>(res.begin(), res.end());
    }
};

滑动哈希:

class Solution {
public:
    vector<string> findRepeatedDnaSequences(string s) {
        vector<int> nums(s.size());
        for (int i = 0; i < s.size(); i++) {
            switch (s[i]) {
                case 'A':
                    nums[i] = 0;
                    break;
                case 'C':
                    nums[i] = 1;
                    break;
                case 'G':
                    nums[i] = 2;
                    break;
                case 'T':
                    nums[i] = 3;
                    break;
            }
        }

        unordered_set<int> seen;
        unordered_set<string> res;

        int L = 10;
        int R = 4;
        int RL = pow(R, L - 1);
        int windowHash = 0;

        int left = 0, right = 0;
        while (right < nums.size()) {
            windowHash = nums[right] + windowHash * R;
            right++;

            if (right - left == L) {
                if (seen.count(windowHash)) {
                    res.insert(s.substr(left, 10));
                }
                else {
                    seen.insert(windowHash);
                }
                windowHash = windowHash - RL * nums[left];
                left++;
            }
        }
        return vector<string>(res.begin(), res.end());
    }
};

28. 找出字符串中第一个匹配项的下标

class Solution {
public:
    int strStr(string haystack, string needle) {
        int L = needle.size();
        int Q = 257;
        int R = 256;
        long RL = 1;
        for (int i = 0; i < L - 1; i++) {
            RL = (RL * R) % Q;
        }

        int needleHash = 0;
        for (int i = 0; i < needle.size(); i++) {
            needleHash = ((needleHash * R) % Q + needle[i]) % Q;
        }

        int left = 0, right = 0;
        int windowHash = 0;
        while (right < haystack.size()) {
            windowHash = ((windowHash * R) % Q + haystack[right]) % Q;
            right++;

            cout << haystack.substr(left, right-left) << endl;

            if (right - left == L) {
                if (windowHash == needleHash) {
                    bool res = true;
                    for (int j = 0; j < needle.size(); j++)
                        res = res && (haystack[left+j] == needle[j]);
                    if (res) return left;
                }
                windowHash = (windowHash - (haystack[left] * RL) % Q + Q) % Q;
                left++;
            }
        }
        return -1;
    }
};

标签:KARP,right,nums,int,res,windowHash,算法,LBLD,size
From: https://www.cnblogs.com/yangxuanzhi/p/17316352.html

相关文章

  • 基于ADMM算法的主从配电网分布式有功无功调度
    基于ADMM算法的主从配电网分布式有功无功调度摘要:代码主要做的是一个配电网分布式调度的问题,模型参考的是主动配电网的无功优化控制模型,在具体的配电网分区上与之有些许不同,具体看代码的注释,在完成配电网基本优化模型的构建后,参考文档2,构建了基于串行ADMM和并行ADMM算法的分布式......
  • 基于小生境粒子群算法的配电网有功-无功协调优化
    基于小生境粒子群算法的配电网有功-无功协调优化主要内容:代码主要做的是考虑光伏出力波动性的配电网有功无功协调优化,在调度模型中考虑了光伏并网的波动性,并考虑用储能对其进行平抑,配电网调度模型中含有的设备主要包括:光伏逆变器、变压器、电容等设备,目标函数包括调压总成本、电......
  • 基于ISODATA改进算法的负荷场景曲线聚类(适用于风光场景生成)
    基于ISODATA改进算法的负荷场景曲线聚类(适用于风光场景生成)摘要:代码主要做的是一种基于改进ISODATA算法的负荷场景曲线聚类,代码中,主要做了四种聚类算法,包括基础的K-means算法、ISODATA算法、L-ISODATA算法以及K-L-ISODATA算法,并且包含了对聚类场景以及聚类效果的评价,通过DBI的计......
  • 算法 | 数字图像处理之「中值滤波」
    中值滤波原理中值滤波就是用一个奇数点的移动窗口,将窗口中心点的值用窗口内个点的中值代替。假设窗口内有5点,其值为80、90、200、110和120,那么此窗口内各点的中值即为110。设有一个一维序列\(f_1,f_2,...,f_n\),取窗口长度(点数)为m(m为奇数),对其进行中值滤波,就是从输入序列中相机抽......
  • 储能选址定容matlab 采用改进遗传算法得到任意数量储能选址定容结果
    储能选址定容matlab采用改进遗传算法得到任意数量储能选址定容结果,以网损为目标,通过储能出力约束、soc约束实现储能选址定容优化结果,程序运行稳定ID:5958688572560150......
  • 两阶段鲁棒优化模型 多场景 采用matlab编程两阶段鲁棒优化程序,考虑四个场景,模型采用列
    两阶段鲁棒优化模型多场景采用matlab编程两阶段鲁棒优化程序,考虑四个场景,模型采用列与约束生成(CCG)算法进行求解,场景分布的概率置信区间由1-范数和∞-范数约束,程序含拉丁超立方抽样+kmeans数据处理程序,程序运行可靠,有详细资料YID:69120677501311622......
  • 改进鲸鱼算法 微网能量优化管理 提出一种基于改进鲸鱼优化算法的多时间尺度下能量优化
    改进鲸鱼算法微网能量优化管理编程语言:matlab提出一种基于改进鲸鱼优化算法的多时间尺度下能量优化方法,首先根据长短期记忆网络(LongShortTermMemory,LSTM)预测得到的可再生能源出力和负荷需求预先制定调度规划,然后以此预测数据为基础,采用改进鲸鱼优化算法调整可控设备出力,优......
  • 微网孤岛优化调度 matlab 采用灰狼算法实现微网孤岛优化调度,考虑风光、微燃机、燃料电
    微网孤岛优化调度matlab编程语言:matlab内容摘要:采用灰狼算法实现微网孤岛优化调度,考虑风光、微燃机、燃料电池和蓄电池等主体,考虑价格型和激励型需求响应,以经济成本和环境治理成本为目标进行优化,得到优化结果。有详细模型资料ID:4750676854285348......
  • c#算法例子
    1,计算几个区间是否重叠有几组数据,满足以下条件:每组数据有最大和最小值,且必须有一个最大或一个最小vartempNum=0.001m;varmaxNum=request.AutoOpenOrderCondition.Max(s=>s.MaxPurchasePrice??0)+tempNum;varminNum=request.......
  • 电动汽车优化模型matlab 狼群算法
    电动汽车优化模型matlab狼群算法采用matlab编程得到不同电动汽车参与情况下的整体负荷情况,明显看出电动汽车充放电有利于微网的削峰填谷,程序采用狼群算法,有参考资料ID:1150676488492685......