POJ 1200 Crazy Search 查找有多少种不同的子串(hash)
生活随笔
收集整理的這篇文章主要介紹了
POJ 1200 Crazy Search 查找有多少种不同的子串(hash)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.采用map解題
- 2.采用hash查找
題目鏈接: http://poj.org/problem?id=1200
題目大意:給定子串長度,字符中不同字符數量,以及一個字符串,求不同的子串數量。
1.采用map解題
把子串插入map,map自動去重,最后輸出map的size
結果是超時的。
超時代碼:
2.采用hash查找
- 先將字符串中先后出現的字符映射成1,2,3,4…比如abac(1213)
- 在將每個子串對應的sublen個字符哈希得到哈希值,因為題目說可能的子串組合小于1600萬種,我們把得到的哈希值對1600萬求模,存在數組中置為1(初始為0)。
- 對后面的子串的哈希值在數組中檢查,如果為0,則不存在,種類+1,如果為1,說明這種子串已存在,跳過,循環遍歷字符串
- hash可以實現O(1)時間復雜度查找,所以時間比較短。
- 該題目情況下,所有子串要求的長度是一樣的,用類似m進制數的哈希函數沒有沖突,如果子串長度不要求一樣,則以下求解方法存在沖突可能(一個很長的子串哈希完的哈希int值溢出了,即高位舍棄變成很小的數,這可能與短字符串的哈希值一樣,造成沖突)。
AC代碼:
總結
以上是生活随笔為你收集整理的POJ 1200 Crazy Search 查找有多少种不同的子串(hash)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 220. 存在重复元素
- 下一篇: oid 值 内存使用_[技术干货] za