題目:
給定字串 s 和 t ,判斷 s 是否為 t 的子串行。
你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長(長度 ~= 500,000),而 s 是個短字串(長度 <=100)。
字串的乙個子串行是原始字串刪除一些(也可以不刪除)字元而不改變剩餘字元相對位置形成的新字串。(例如,"ace"是"abcde"的乙個子串行,而"aec"不是)。
示例 1:
s = "abc", t = "ahbgdc"
返回 true.
示例 2:
s = "axc", t = "ahbgdc"
返回 false.
如果有大量輸入的 s,稱作s1, s2, ... , sk 其中 k >= 10億
解:利用雙指標,p指向s的起始位置,q指向t的起始位置
依次移動q,檢測當前q位置字元是否和當前p位置字元相等,相等的話p向後移動一位。
結束條件是q移動到末尾,或者p移動到末尾。
所以**是
bool issubsequence(char * s, char * t)
indext ++;
}return indexs == strlen(s);
}
很好理解,這樣問題就解決了。
再來思考如果s特別多(幾十億),那這個方法就不太適合了,因為s有多少個,就要遍歷t多少遍,所以這個量級是很大的,故不合適。
s有很多,但是t只有乙個,那我們可不可以處理一下t,然後縮短對比的時間。
利用動態規劃進行處理,那麼就尋找狀態轉移方程。
因為題目規定,字元只包含小寫英文本母,所以用26個int表示。初始化t個int[26]陣列
26個位置分別表示當前位置a~z出現的位置,
用0~26表示a~z
我們倒序遍歷t,那麼就有
如果當前字元是a,f[x][0]=當前下標
如果不是,f[x][0]=f[x+1][0]
如果當前字元是b,f[x][1]=當前下標
如果不是,f[x][1]=f[x+1][1]
當狀態轉移方程處理完成後,那麼就遍歷s,取出當前字元對應位置的值,將t下標挪到該位置,
所以,**是
bool issubsequence1(char* s, char* t)
for (int i = m - 1; i >= 0; i--)
}int add = 0;
for (int i = 0; i < n; i++)
add = f[add][s[i] - 'a'] + 1;
}return true;
}
複雜度分析
時間複雜度:o(m×∣σ∣+n),其中 n 為 s 的長度,m 為 t 的長度,σ 為字符集,在本題中字串只包含小寫字母,∣σ∣=26。預處理時間複雜度 o(m)o(m),判斷子串行時間複雜度 o(n)o(n)。
如果是計算 k 個平均長度為 n 的字串是否為 t 的子串行,則時間複雜度為 o(m×∣σ∣+k×n)。空間複雜度:o(m×∣σ∣),為動態規劃陣列的開銷。
mysql 判斷字串是否為其他字串的子集
1.mysql 提供單個用逗號隔開判斷某個字串是否包含在其他字串的之內 find in set 需要匹配的字串 源字串 demo select find in set 111 111,22,3333,43 from user user 是測試表名 返回值 select find in set 777...
判斷字串是否由數字和字母組成
今天有人問我如何判斷字串是否又字母和數字組成啥也不說了 直接上 如果需要判斷是否有大小寫的話你可以自己稍微定製一下 import 判斷字串是否是由字母和數字組成 param str 要判斷的字串 return yes 只有字串和數字 no 只有字串或者只有字母 bool adjuststring n...
判斷子串和判斷兩個字串是否由另乙個旋轉而來的問題
題目 假定又乙個issubstring,可檢查乙個單詞是否為其他字串的子串。給定兩個字串s1和s2,請編寫 檢查s2是否為s1旋轉而成,要求只能呼叫一次issubstring。比如,waterbottle是erbottlewat旋轉後的字串。首先要解決的是判斷是不是子串的問題,這個不難。然後判斷其中...