Given a stringsand a stringt, check ifsis subsequence oft.
You may assume that there is only lower case English letters in bothsandt.tis potentially a very long (length ~= 500,000) string, andsis a short string (<=100).
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie,"ace"is a subsequence of"abcde"while"aec"is not).
Example 1:s="abc",t="ahbgdc"
Returntrue.
Example 2:s="axc",t="ahbgdc"
Returnfalse.
Follow up:
If there are lots of incoming S, say S1, S2, ... , Sk where k >= 1B, and you want to check one by one to see if T has its subsequence. In this scenario, how would you change your code?
publicbooleanisSubsequence(String s,String t) {if (s ==null|| t ==null) {returnfalse; }int n =s.length();int m =t.length();int i =0;int j =0;while (i < n && j < m) {if (s.charAt(i) ==t.charAt(j)) { i++; j++; } else { j++; } }if (i == n && j <= m) {returntrue; } else {returnfalse; }}
把discuss里大神写的follow up二分代码贴上来参考,自己是想不出来的了:
// Follow-up: O(N) time for pre-processing, O(Mlog?) for each S.// Eg-1. s="abc", t="bahbgdca"// idx=[a={1,7}, b={0,3}, c={6}]// i=0 ('a'): prev=1// i=1 ('b'): prev=3// i=2 ('c'): prev=6 (return true)// Eg-2. s="abc", t="bahgdcb"// idx=[a={1}, b={0,6}, c={5}]// i=0 ('a'): prev=1// i=1 ('b'): prev=6// i=2 ('c'): prev=? (return false)publicbooleanisSubsequence(String s,String t) {List<Integer>[] idx =newList[256]; // Just for clarityfor (int i =0; i <t.length(); i++) {if (idx[t.charAt(i)] ==null) idx[t.charAt(i)] =newArrayList<>(); idx[t.charAt(i)].add(i); }int prev =0;for (int i =0; i <s.length(); i++) {if (idx[s.charAt(i)] ==null) returnfalse; // Note: char of S does NOT exist in T causing NPEint j =Collections.binarySearch(idx[s.charAt(i)], prev);if (j <0) j =-j -1;if (j == idx[s.charAt(i)].size()) returnfalse; prev = idx[s.charAt(i)].get(j) +1; }returntrue; }