abaaabb
bbaabba
如何o(1)判斷兩個字串相等
乙個想法是先轉成2進製,再轉成10進製,hash成整數值,o(1)比較
但是這個hash複雜度卻是與串長同階,類似於a*base^2+b
o(1)時間知道hash值就能o(1)比較兩個字串是否相等
baabcbba
baabaab
baabc
ba記錄字首的hash值
1*3 ^3+0*3^2+
hash[l~r]
pre[x]=pre[x-1]*26+(s[x]-'a')
pre[r]=hash[l~r]
pre[r] pre[l-1]
hash[l~r]
= pre[r]-pre[l-1]*26^(r-l)
abba
ab的hash
如何求字尾ba的hash
1*2^3+2*2^2+2*2^1+1*2^0
ab1*2^1+2*2^0
讓ab移位到和abba,*2^(r-l),移兩位
這個冪次可以字首乘o(n)預處理。。不要每次都算
然後讓hash["abba"]-hash["ab"]*偏移量
就能得到字尾"ba",的hash值
由於int或者long long是自然溢位
出題人可能會卡這個模數。。就是兩個不同的hash值。。取模後相同了。。
區間相減。。有可能出現負數。。
然鵝。。-3mod10==7mod10,你-3mod10,本來應該是7,但是你算出來的這個-3可能與其他串hash值相同?
所以我們還是(a-b+mod)%mod,我們還可以用雙hash..弄倆模數。。取模不相等才是合法的。。
abababaababacb
ababacb
kmp演算法需要觀察乙個顯然成立。。那就是匹配的串其字首必定相等。。那麼。。可能匹配的串其字首
nxt陣列:求乙個字首與字尾匹配。。請求出最長的字首長度。。輸出長度和char答案
乙個顯然的事實:長度為len的字首和字尾分別只有乙個
另乙個顯然的事實:每乙個字尾都是不同的
nxt陣列求得是除了以i結尾的串的,最長的字首的長度。。但是這個字首長度我們一般不會擴充套件到以i結尾,即1~i的長度(串從1開始)
ababac t
nxt[1]=0;是乙個顯然的事實
nxt[4]=2
nxt[5]=3
nxt[4]的字首後面加一格是nxt[5]所考慮的字首。。nxt[4]的字尾加一格是nxt[5]所考慮的字尾
n/1+n/2+n/3+......+n/n==>nlogn
週期串滿足的性質:
應該是len/(len-next[len])
()()()......()一共有n個()。那麼next[len]就是n-1個()
所以用len-next[len]就是乙個()。然後一除就是答案
可以證明這樣一定是最優的
證明的話,我覺得可以反證。就是假設有()比()短是的n
使得n更大
那麼nxt也一定更大,矛盾
就比如abcdabcdabcd
設週期串的長度是len
第乙個d結尾的nxt等於0
第二個d結尾的nxt等於0+len
同理第n個d結尾的nxt就會等於n-1*len
那麼。。len=n*len,nxt[len]=(n-1)*len,
其實我們本來不知道len是多少。。但是列出此方程就能得出
len=len-nxt[len]=n*len-(n-1)*len=len;
所以說這個是成立的。。。
下面我們可以再來研究一下回文串
回文串最顯著的特性就是對稱性
但是注意到乙個尷尬的事實。。長度為偶數的回文串找不到回文中心
所以列舉回文中心是沒法找到偶數回文串的
我們要做一些處理。。那就是中間插入一些奇怪的玩意。。比如#
a#b#b#a
這樣就能找到。。
偶數回文串的中心
記乙個回文串的回文中心的下標是center
字串相關知識
1.字串長度 strlen 求字串長度時,遇到 0 就停下,前面所經過的字元數,就是字串的長度,不包括 0 注意 該函式的返回值為無符號整數。例子 int main else return 0 上述 輸出為什麼呢?因為返回值無符號數,無符號數 無符號數永遠是大於等於0的,所以輸出了if分支的語句。2...
字串相關知識
可不使用new方式 當從字串池中查詢,沒有時,則需要字串建立 例子 string prompt hello,world 使用後new建立方式 每次建立乙個新物件 例子 string prompt new string hello,world 字串相等比較 equals 字元名稱.equalsigno...
字串知識整理
字串常用功能 string.capitalize 返回原字串,且將字串第乙個字母轉為大寫 string.center width fillchar 將字串中心化處理,兩邊用乙個字元表示 切記非字串 string.count sub start end 計數字串中某子集的數量,可以通過start和st...