題目大意:給乙個字串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...