package com.freetymekiyan.algorithms.level.medium; /** * Given a string s and a string t, check if s is subsequence of t. * <p> * 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). * <p> * 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). * <p> * Example 1: * s = "abc", t = "ahbgdc" * <p> * Return true. * <p> * Example 2: * s = "axc", t = "ahbgdc" * <p> * Return false. * <p> * 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? * <p> * Answer: * In this case, we can iterate through T once and build a list for each letter in T with its indices in increasing * trend. Then for each S, we check its characters one by one in the list, find the minimum index possible(Greedy, * Binary Search). If there is a possible index sequence for S, return true. If not, return false. * <p> * Tags: Binary Search, Dynamic Programming, Greedy */ public class IsSubsequence { /** * Two pointers. * For each character in T, check whether it's the same as current character in S. * If it's the same, move index in S by 1. * If it reaches the end of S, return true. * If it's not the same, continue. * Stop when T is fully traversed. */ public boolean isSubsequence(String s, String t) { if (s.length() == 0) { return true; } int indexS = 0; for (int i = 0; i < t.length(); i++) { if (t.charAt(i) == s.charAt(indexS)) { indexS++; if (indexS == s.length()) { return true; } } } return false; } /** * Recursion. * Recurrence relation: whether s is the subsequence of t can be divided into 2 parts: * 1) the first character of s is found in t * 2) the rest of s is the subsequence of the rest of t */ public boolean isSubsequenceB(String s, String t) { if (s.length() == 0) { return true; } for (int i = 0; i < t.length(); i++) { if (s.charAt(0) == t.charAt(i)) { return isSubsequenceB(s.substring(1), t.substring(i + 1)); } } return false; } }