* 判斷子串行
* 給定字串 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 ...