卖萌的弱渣

I am stupid, I am hungry.

Is Subsequence

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

You may assume that there is only lower case English letters in both s and t. t is potentially a very long (length ~= 500,000) string, and s is 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”

Return true.

Example 2:

s = “axc”, t = “ahbgdc”

Return false.

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?

Solution

  • 同时便利s和t,只要有s[i]==t[j],i+=1. 否则只增加j
  • 若i 最终和s长度相同,则true

  • Java

(Is-Subsequence.java) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Solution {
    public boolean isSubsequence(String s, String t) {
        int i=0;
        int j=0;
        if (t.length() < s.length())
            return false;

        while (i<s.length() && j<t.length()){
            if (s.charAt(i)==t.charAt(j)){
                i ++;
            }
            j++;
        }
        if(i==s.length())
            return true;
        return false;
    }
}
  • Python
(is-Subsequence.py) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution(object):
    def isSubsequence(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """

        if len(t) < len(s):
            return False
        i = 0
        j = 0
        while i < len(s) and j < len(t):
            if s[i] == t[j]:
                i += 1
            j += 1
        return i == len(s)