**自九章演算法(位址)
題目:
假設s是乙個無限迴圈的字串」abcdefghijklmnopqrstuvwxyz」,s就是乙個」...zabcdefghijklmnopqrstuvwxyza...」這樣的字串,現在給你另外乙個字串p,求p中存在多少個截然不同的子串,使得它們也是s的子串。p只包括英語的小寫字母並且p的長度可能大於10000。
樣例說明
輸入:a
輸出:1
說明:只有'a'是s的子串。
輸入:cac
輸出:2
說明:只有'a'和'c'是s的子串。
輸入:zab
輸出:6
說明:'z','a','b','za','ab','zab'都是s的子串。
題解:1.這一題我們首先考慮的是,乙個長為n的連續的串,有多少個符合題目要求的子串呢?經過思考我們可以得出長為n的連續的串,我們有1+2+3+...+n這麼多個符合題目要求的子串。
2.解決了上述這個問題,我們直接找出p中所有連續的子串的長度l1,l2,l3...ln,我們若是直接對(1~l1)(1~l2)...(1~ln)求和,我們得到的結果顯然是錯誤的,因為會存在字串重複的問題,例如abcdpjiezabc,這裡abcd和zabc有一部分abc是重複的,我們要求有多少種不同的子串,就需要把這部分重複的減去。如果我們採用暴力計算的方法顯然很麻煩,那麼我們要如何才能避免計算到重複的呢?
3.在我們學過的資料結構中,有一種資料結構可以避免重複,那就是雜湊表!
在本問題中,我們也可以通過雜湊表去重。對於乙個符合條件的子串(符合條件指的是該串為p的子串),我們只需要記錄「長度」和「結尾字元」這兩個關鍵字就可以唯一確定這個子串。我們以abcdpjiezabc為例,兩個符合條件的極大子串為abcd和zabc,對於abcd,我們把[1,a],[2,b],[3,c],[4,d]記錄到雜湊表。細心的讀者可以發現,我們不需要記錄[1,b],[2,c]等等,因為[2,b],[3,c]天然包含了長度比它們小的子串。對於zabc,我們記錄[1,z],[2,a],[3,b][4,c]
4.得到雜湊表之後,我們如何統計答案呢?
我們發現,對於[1,a],因為雜湊表中已經存在[2,a],所以[1,a]所表示的子串已經在[2,a]中被統計。也就是說,為了避免重複統計,我們只需要記錄某個字母結尾的、長度最大的那個符合條件的子串長度就可以了。假設我們的雜湊表中對應某個字母p的最長子串長度為k,因為長為k的字串,有k個子串是以p結尾的,那麼我們需要給最終答案加上k,這種統計方式把所有可能的子串都記錄其中,並且不會重複。綜上我們的演算法時間複雜度為遍歷陣列和更新雜湊表的時間複雜度:o(n),空間複雜度為o(1)。
solution
#include #include#include
#include
using
namespace
std;
int findsubstringinwraproundstring(string &str)
else
dp[str[i] - '
a'] = max(dp[str[i] - 'a'
], pos);
}int res = 0
;
for (int i = 0; i < 26; ++i)
return
res;
}int
main()
js裡面的字串擷取
substr 方法可在字串中抽取從 start 下標開始的指定數目的字元。使用 substr start num 栗子1 var str sxswnspcx var result str.substr 3 start,num console.log result 得到 wnspcx 栗子2 var ...
python爬蟲字元問題 爬蟲裡面的字串編碼的坑
初學python寫爬蟲程式,上手很快,但字串的編碼問題卻一直困擾著我,我相信每乙個學習爬蟲的人都有過和我一樣的困惑。一旦走上了程式設計之路,如果你不把編碼問題搞清楚,那麼它就像幽靈一般糾纏你整個職業生涯,所以,今天就談談python的字串編碼。0.前言 大家都知道,我們的計算機只能處理數字,而計算機...
我們來談談C 裡面的字串
1 char 與 char 的區別 對於很多人來說,char 與 char 好像沒什麼區別,我以前也這麼覺得,不都是char的指標嗎?仔細翻閱資料後,發現區別可大了。現在就來看看吧。include include using namespace std int main 這個地方如果不用 h 初始化...