The Subsequence Algorithm for Two Strings – How to Check i

  • 时间:2020-09-21 09:15:21
  • 分类:网络文摘
  • 阅读:100 次

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?

The Two Pointer String Subsequence Algorithm

If source string s is larger than source string t, s must not be a subsequence of t. Otherwise, we can have two pointers i and j, pointing initialially to the begining of the two strings s and t respectively. If at any time, s[i] == t[j], we move both pointers to next position, otherwise, we need to increment j, until either of the pointer is beyond the end of the source string.

If ever i reaches the end, it indicates that source string s is a subsequence of string b. The time complexity of the two pointer algorithm regarding this problem is O(Max(N, M)) where N and M are the sizes of the string s and t respectively.

The algorithm uses a constant O(1) space.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
    bool isSubsequence(string s, string t) {
        if (s.size() > t.size()) return false;
        int i = 0, j = 0;
        int n1 = s.size(), n2 = t.size();
        while ((i < n1) && (j < n2)) {
            if (s[i] == t[j]) {
                i ++;
                j ++;
            } else {
                j ++;
            }
        }
        return i == n1;
    }
};
class Solution {
public:
    bool isSubsequence(string s, string t) {
        if (s.size() > t.size()) return false;
        int i = 0, j = 0;
        int n1 = s.size(), n2 = t.size();
        while ((i < n1) && (j < n2)) {
            if (s[i] == t[j]) {
                i ++;
                j ++;
            } else {
                j ++;
            }
        }
        return i == n1;
    }
};

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
The Common Kodi Errors and Use of Free VPN for Linux  Java Pattern: Use Atomic Boolean to Return Single Usage Object  Significance of HTML and CSS in Mobile App Development  How to Reverse Words in a String using Modern Programming Langua  The Python Function to Retrieve the Producer Reward for Witness  Function to Compute the Average Salary Excluding the Minimum and  Efficient Algorithms to Compute The kth Factor of a Natural Numb  Can We Make Arithmetic Progression From Sequence of Numbers?  How to SSH to Remote Host using the Priviate/Public Keys Authent  How do you Test Getter and Setter Interface in Java using Mockit 
评论列表
添加评论