天天看點

c語言判斷字元串鏡像,leetcode392(判斷子序列)--C語言實作

求:

給定字元串 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、動态規劃

參考官方題解。