Thursday, August 6, 2020

LeetCode [392] Is Subsequence

392. Is Subsequence
Easy

Given a string s and a string t, check if s is subsequence of t.

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).

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?

Credits:
Special thanks to @pbrother for adding this problem and creating all test cases.

 

Example 1:

Input: s = "abc", t = "ahbgdc"
Output: true

Example 2:

Input: s = "axc", t = "ahbgdc"
Output: false

 

Constraints:

  • 0 <= s.length <= 100
  • 0 <= t.length <= 10^4
  • Both strings consists only of lowercase characters.
class Solution {
    public boolean isSubsequence(String s, String t) {
        int i = 0, j = 0;
        while(j<t.length()){
            if(i<s.length() && s.charAt(i)==t.charAt(j)){
                i++;
            }
            j++;
        }
        return i==s.length();
    }
}

//Followup
class Solution {
    public boolean isSubsequence(String s, String t) {
        int ns = s.length(), nt = t.length();
        List<Integer>[] index = new List[256];
        for(int i=0; i<nt; ++i){
            char c = t.charAt(i);
            if(index[c] == null) index[c] = new ArrayList<Integer>();
            index[c].add(i);
        }
        
        int next = 0;
        for(int i=0; i<ns; ++i){
            char c = s.charAt(i);
            //index[c] should contain an index >= next
            if(index[c] == null) return false;
            //https://www.geeksforgeeks.org/collections-binarysearch-java-examples/
            int p = Collections.binarySearch(index[c], next);
            if(p<0) p = -p-1;
            if(p==index[c].size()) return false;
            next = index[c].get(p) + 1;
        }
        
        return true;
    }
}

No comments:

Post a Comment