Check if one string is subsequence of other
Given two strings s1 and s2, find if the first string is a Subsequence of the second string, i.e. if s1 is a subsequence of s2. A subsequence is a sequence that can be derived from another sequence by deleting some elements without changing the order of the remaining elements.
Examples :
Input: s1 = "AXY", s2 = "ADXCPY"
Output: True
All characters of s1 are in s2 in the same orderInput: s1 = "AXY", s2 = "YADXCP"
Output: False
All characters are present, but order is not same.Input: s1 = "gksrek", s2 = "geeksforgeeks"
Output: True
Using Recursion:
We match last characters of the two strings s1 and s2 of lengths m and n
- If the last characters match, we call for m-1 and n-1
- Otherwise, we ignore the last character of s2 and therefore call for m and n-1.
Below is the Implementation of the above idea:
#include <iostream>
#include <string>
using namespace std;
// Returns true if s1[0..m-1] is a subsequence of s2[0..n-1]
bool isSubSeqRec(const string& s1, const string& s2, int m, int n)
{
// Base Cases
if (m == 0)
return true;
if (n == 0)
return false;
// If last characters of two strings are matching
if (s1[m - 1] == s2[n - 1])
return isSubSeqRec(s1, s2, m - 1, n - 1);
// If last characters are not matching
return isSubSeqRec(s1, s2, m, n - 1);
}
// Wrapper function
bool isSubSeq(const string& s1, const string& s2)
{
int m = s1.length();
int n = s2.length();
if (m > n) return false;
return isSubSeqRec(s1, s2, m, n);
}
int main()
{
string s1 = "gksrek";
string s2 = "geeksforgeeks";
isSubSeq(s1, s2) ? cout << "Yes " : cout << "No";
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
// Helper function that checks if s1 is a subsequence of s2
bool isSubSeqRec(const char* s1, const char* s2, int m, int n)
{
// Base Cases
if (m == 0)
return true;
if (n == 0)
return false;
// If last characters of two strings are matching
if (s1[m - 1] == s2[n - 1])
return isSubSeqRec(s1, s2, m - 1, n - 1);
// If last characters are not matching
return isSubSeqRec(s1, s2, m, n - 1);
}
// Wrapper function
bool isSubSeq(const char* s1, const char* s2)
{
int m = strlen(s1);
int n = strlen(s2);
if (m > n) return false;
return isSubSeqRec(s1, s2, m, n);
}
int main()
{
const char* s1 = "gksrek";
const char* s2 = "geeksforgeeks";
isSubSeq(s1, s2) ? printf("Yes\n") : printf("No\n");
return 0;
}
// Recursive Java program to check if a string
// is subsequence of another string
import java.io.*;
class SubSequence {
// Returns true if s1[] is a subsequence of s2[]
// m is length of s1 and n is length of s2
static boolean isSubSequence(String s1, String s2,
int m, int n)
{
// Base Cases
if (m == 0)
return true;
if (n == 0)
return false;
// If last characters of two strings are matching
if (s1.charAt(m - 1) == s2.charAt(n - 1))
return isSubSequence(s1, s2, m - 1, n - 1);
// If last characters are not matching
return isSubSequence(s1, s2, m, n - 1);
}
// Driver program
public static void main(String[] args)
{
String s1 = "gksrek";
String s2 = "geeksforgeeks";
int m = s1.length();
int n = s2.length();
boolean res = isSubSequence(s1, s2, m, n);
if (res)
System.out.println("Yes");
else
System.out.println("No");
}
}
// Contributed by Pramod Kumar
# Recursive Python program to check
# if a string is subsequence
# of another string
# Returns true if s1[] is a
# subsequence of s2[].
def isSubSequence(string1, string2, m, n):
# Base Cases
if m == 0:
return True
if n == 0:
return False
# If last characters of two
# strings are matching
if string1[m-1] == string2[n-1]:
return isSubSequence(string1, string2, m-1, n-1)
# If last characters are not matching
return isSubSequence(string1, string2, m, n-1)
# Driver program to test the above function
string1 = "gksrek"
string2 = "geeksforgeeks"
if isSubSequence(string1, string2, len(string1), len(string2)):
print("Yes")
else:
print("No")
# This code is contributed by BHAVYA JAIN
// Recursive C# program to check if a string
// is subsequence of another string
using System;
class GFG {
// Returns true if s1[] is a
// subsequence of s2[] m is
// length of s1 and n is length
// of s2
static bool isSubSequence(string s1, string s2,
int m, int n)
{
// Base Cases
if (m == 0)
return true;
if (n == 0)
return false;
// If last characters of two strings
// are matching
if (s1[m - 1] == s2[n - 1])
return isSubSequence(s1, s2, m - 1, n - 1);
// If last characters are not matching
return isSubSequence(s1, s2, m, n - 1);
}
// Driver program
public static void Main()
{
string s1 = "gksrek";
string s2 = "geeksforgeeks";
int m = s1.Length;
int n = s2.Length;
bool res = isSubSequence(s1, s2, m, n);
if (res)
Console.Write("Yes");
else
Console.Write("No");
}
}
// This code is contributed by nitin mittal.
// Recursive JavaScript program to check if
// a string is subsequence of another string
// Returns true if s1[] is a
// subsequence of s2[] m is
// length of s1 and n is length
// of s2
function isSubSequence(s1, s2, m, n) {
// Base Cases
if (m == 0)
return true;
if (n == 0)
return false;
// If last characters of two strings
// are matching
if (s1[m - 1] == s2[n - 1])
return isSubSequence(s1, s2, m - 1, n - 1);
// If last characters are not matching
return isSubSequence(s1, s2, m, n - 1);
}
// Driver code
let s1 = "gksrek";
let s2 = "geeksforgeeks";
let m = s1.length;
let n = s2.length;
let res = isSubSequence(s1, s2, m, n);
if (res)
console.log("Yes");
else
console.log("No");
<?php
// Recursive PHP program to check
// if a string is subsequence of
// another string
// Returns true if s1[] is a
// subsequence of s2[]. m is
// length of s1 and n is
// length of s2
function isSubSequence($s1, $s2,
$m, $n)
{
// Base Cases
if ($m == 0) return true;
if ($n == 0) return false;
// If last characters of two
// strings are matching
if ($s1[$m - 1] == $s2[$n - 1])
return isSubSequence($s1, $s2,
$m - 1, $n - 1);
// If last characters
// are not matching
return isSubSequence($s1, $s2,
$m, $n - 1);
}
// Driver Code
$s1= "gksrek";
$s2 = "geeksforgeeks";
$m = strlen($s1);
$n = strlen($s2);
$t = isSubSequence($s1, $s2, $m, $n) ?
"Yes ":
"No";
if($t = true)
echo "Yes";
else
echo "No";
// This code is contributed by ajit
?>
Output
Yes
Time Complexity: O(n), The recursion will call at most n times.
Auxiliary Space: O(n) for recursion call stack.
Iterative Solution:
The idea is to use two pointers, one pointer will start from start of s1 and another will start from start of s2. If current character on both the indexes are same then increment both pointers otherwise increment the pointer which is pointing s2.
Follow the steps below to solve the problem:
- Initialize the pointers i and j with zero, where i is the pointer to s1 and j is the pointer to s2.
- If s1[i] = s2[j] then increment both i and j by 1.
- Otherwise, increment only j by 1.
- If i reaches the end of s1 then return TRUE else return FALSE.
Below is the implementation of the above approach
/*Iterative C++ program to check
If a string is subsequence of another string*/
#include <bits/stdc++.h>
using namespace std;
/*Returns true if s1 is subsequence of s2*/
bool isSubSeq(const string& s1, const string& s2)
{
int m = s1.length(), n = s2.length();
// For s1 to be subsequence, its length must
// smaller than s2
if (m > n) return false;
int i = 0, j = 0;
while (i < m && j < n) {
if (s1[i] == s2[j])
i++;
j++;
}
/*If i reaches end of s1,that mean we found all
characters of s1 in s2,
so s1 is subsequence of s2, else not*/
return i == m;
}
int main()
{
string s1 = "gksrek";
string s2 = "geeksforgeeks";
isSubSeq(s1, s2) ? cout << "Yes " : cout << "No";
return 0;
}
/*package whatever //do not write package name here */
import java.io.*;
import java.util.*;
class GFG {
/*Iterative Java program to check
If a String is subsequence of another String*/
/*Returns true if s1 is subsequence of s2*/
static boolean issubsequence(String s1, String s2)
{
int n = s1.length(), m = s2.length();
int i = 0, j = 0;
while (i < n && j < m) {
if (s1.charAt(i) == s2.charAt(j))
i++;
j++;
}
/*If i reaches end of s1,that mean we found all
characters of s1 in s2,
so s1 is subsequence of s2, else not*/
return i == n;
}
public static void main(String args[])
{
String s1 = "gksrek";
String s2 = "geeksforgeeks";
if (issubsequence(s1, s2))
System.out.println(
"gksrek is subsequence of geekforgeeks");
else
System.out.println(
"gksrek is not a subsequence of geekforgeeks");
}
}
// This code is contributed by shinjanpatra.
# Iterative JavaScript program to check
# If a string is subsequence of another string
# Returns true if s1 is subsequence of s2
def issubsequence(s1, s2):
n, m = len(s1), len(s2)
i, j = 0, 0
while (i < n and j < m):
if (s1[i] == s2[j]):
i += 1
j += 1
# If i reaches end of s1,that mean we found all
# characters of s1 in s2,
# so s1 is subsequence of s2, else not
return i == n
# driver code
s1 = "gksrek"
s2 = "geeksforgeeks"
if (issubsequence(s1, s2)):
print("gksrek is subsequence of geekforgeeks")
else:
print("gksrek is not a subsequence of geekforgeeks")
# This code is contributed by shinjanpatra
// C# code to implement the approach
using System;
class GFG {
/*Returns true if s1 is subsequence of s2*/
static bool issubsequence(string s1, string s2)
{
int n = s1.Length, m = s2.Length;
int i = 0, j = 0;
while (i < n && j < m) {
if (s1[i] == s2[j])
i++;
j++;
}
/*If i reaches end of s1,that mean we found all
characters of s1 in s2,
so s1 is subsequence of s2, else not*/
return i == n;
}
public static void Main(string[] args)
{
string s1 = "gksrek";
string s2 = "geeksforgeeks";
if (issubsequence(s1, s2))
Console.WriteLine(s1 + " is subsequence of "
+ s2);
else
Console.WriteLine(
s1 + " is not a subsequence of " + s2);
}
}
// This code is contributed by phasing17.
/* Iterative JavaScript program to check
if a string is a subsequence of another string */
/* Returns true if s1 is a subsequence of s2 */
function issubsequence(s1, s2) {
let n = s1.length, m = s2.length;
let i = 0, j = 0;
while (i < n && j < m) {
if (s1[i] == s2[j])
i++;
j++;
}
/* If i reaches end of s1, that means we found all
characters of s1 in s2, so s1 is a subsequence of s2 */
return i == n;
}
// Driver code
let s1 = "gksrek";
let s2 = "geeksforgeeks";
if (issubsequence(s1, s2))
console.log("gksrek is a subsequence of geeksforgeeks");
else
console.log("gksrek is not a subsequence of geeksforgeeks");
Output
Yes
Time Complexity: O(n)
Auxiliary Space: O(1)