String (字串雜湊 滑動視窗)

2021-10-08 12:09:43 字數 849 閱讀 9319

題目大意:給乙個字串s,求它連續長度為 m*l 的子串s1,且s1可分為m個長度為 l 的子子串s2不相同的數量。

思路:

對比長度為 l 的字串是否相同,這裡用到了bkdrhash,一般來說最高效的常用hash了,存m個(l * k , l * (k+1))的雜湊值,比較是否相等,不等的話,視窗右移到最右端,依次比較即可,視窗滑動詳解見**。

code:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define gethashval(n, l) hv[n] - hv[n+l] * nbase[l]

using

namespace std;

typedef

long

long

int ll;

typedef

unsigned

long

long ull;

const

int base =31;

ull hv[

100007];

ull nbase[

100007];

mapint> hashmap;

intmain()

} cout<}return0;

}

參考部落格

leetcode 雜湊 滑動視窗 字串

1 leetcode409 給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串 class solution object deflongestpalindrome self,s type s str rtyp...

滑動視窗處理字串 LeetCode

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。一開始的思路是這樣 因為使用list的ind...

LeetCode 字串的排列(滑動視窗)

給定兩個字串 s1 和 s2,寫乙個函式來判斷 s2 是否包含 s1 的排列。換句話說,第乙個字串的排列之一是第二個字串的子串。示例1 輸入 s1 ab s2 eidbaooo 輸出 true 解釋 s2 包含 s1 的排列之一 ba 示例2 輸入 s1 ab s2 eidboaoo 輸出 fals...