求:
給定字元串 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.
解:
1、雙指針
利用2個指針分别周遊字元串s和字元串t,直到某個字元串周遊完成。使用一個周遊findCount來記錄比對字元數,findCount初始化為0,周遊過程中如果發現字元比對,findCount加1。退出時判斷findCount是否與字元串s的長度相等,相等說明是子串,否則不是子串。
時間複雜度:O(M+N),M為字元串s長度,N為字元串t長度,因為N遠大于M,可以近似為O(N)
空間複雜度:O(1)
bool isSubsequence(char* s, char* t){
inti,j;intfindCount = 0;for(i=0,j=0;i
if(s[i]==t[j]){
++i;++findCount;}
}
returnfindCount == strlen(s);}
2、雙指針優化
不計算字元串s和字元串t的長度,直接比。退出的條件是字元串s或字元串t周遊完成。
時間複雜度:O(M+N),M為字元串s長度,N為字元串t長度,因為N遠大于M,可以近似為O(N)
空間複雜度:O(1)
bool isSubsequence(char* s, char* t){
while(1){
if(!*s) return true;if(!*t) return false;if(*t++ == *s) s++;}
}
3、動态規劃
參考官方題解。