判斷子串行is subsequence兩種解法解析

2021-12-29 20:57:28 字數 1196 閱讀 2713

* 判斷子串行

* 給定字串 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.

貪心演算法:

遍歷母串t,時間複雜度是o(n)。定義兩個串的索引,如果發現t的索引和子串s的索引值相等,移動子串s的索引,繼續比對下乙個目標索引值。這個比較暴力,但很簡單。

public class issubsequence

tindex++;//在迴圈中,t的索引每次都增加,所以演算法的複雜度是o(n)。

}return sindex == s.length();//如果長度相等,就是子串

}}* 如果有大量輸入的 s,稱作s1, s2, ... ,

* sk 其中 k >= 10億,你需要依次檢查它們是否為 t 的子串行。在這種情況下,使用:二分查詢演算法:

先記著母串t中的所有字元的索引,存入list結構。基於字元值存入索引,list[字元]=索引i。public static boolean issubsequence2(string s, string t)

if (t.length() == 0)

//只有256個字元,所以這個鍊錶陣列就定義256即可

list list = new list[256];

for (int i = 0; i < t.length(); i++)

list[c].add(i);

}int preindex = -1;

for (int i = 0; i < s.length(); i++)

return true;

}public static int binarysearch(list list, int key)

if (list.get(right) < key) return -1;

return list.get(right);

}

判斷子串行

給定字串 s 和 t 判斷 s 是否為 t 的子串行。你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長 長度 500,000 而 s 是個短字串 長度 100 字串的乙個子串行是原始字串刪除一些 也可以不刪除 字元而不改變剩餘字元相對位置形成的新字串。例如,ace 是 abcde ...

子串行判斷

如下 class solution return true 字母ab yz鍊錶 索引1,索引2,索引 索引索引 判斷子串行,高階 有k個子序列,判斷是否是t的子串行 public static boolean issubsequence string s,string t else int p 1 ...

判斷子串行

給定字串 s 和 t 判斷 s 是否為 t 的子串行。你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長 長度 500,000 而 s 是個短字串 長度 100 字串的乙個子串行是原始字串刪除一些 也可以不刪除 字元而不改變剩餘字元相對位置形成的新字串。例如,ace 是 abcde ...