📌  相关文章
📜  给定两个字符串,判断第一个字符串是否是第二个的子序列

📅  最后修改于: 2022-05-13 01:57:07.764000             🧑  作者: Mango

给定两个字符串,判断第一个字符串是否是第二个的子序列

给定两个字符串str1 和 str2,找出 str1 是否是 str2 的子序列。子序列是可以通过删除一些元素而不改变剩余元素的顺序从另一个序列派生的序列(来源:wiki)。预期的时间复杂度是线性的。

例子 :

Input: str1 = "AXY", str2 = "ADXCPY"
Output: True (str1 is a subsequence of str2)

Input: str1 = "AXY", str2 = "YADXCP"
Output: False (str1 is not a subsequence of str2)

Input: str1 = "gksrek", str2 = "geeksforgeeks"
Output: True (str1 is a subsequence of str2)

这个想法很简单,我们将两个字符串从一侧遍历到另一侧(比如从最右边的字符到最左边)。如果我们找到一个匹配的字符,我们就在两个字符串中前进。否则,我们只在 str2 中前进。

以下是上述思想的递归实现。

C++
// Recursive C++ program to check
// if a string is subsequence
// of another string
#include 
#include 
using namespace std;
 
// Returns true if str1[] is a
// subsequence of str2[]. m is
// length of str1 and n is length of str2
bool isSubSequence(char str1[], char str2[], 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 (str1[m - 1] == str2[n - 1])
        return isSubSequence(str1, str2, m - 1, n - 1);
 
    // If last characters are
    // not matching
    return isSubSequence(str1, str2, m, n - 1);
}
 
// Driver program to test methods of graph class
int main()
{
    char str1[] = "gksrek";
    char str2[] = "geeksforgeeks";
    int m = strlen(str1);
    int n = strlen(str2);
    isSubSequence(str1, str2, m, n) ? cout << "Yes "
                                    : cout << "No";
    return 0;
}


Java
// Recursive Java program to check if a string
// is subsequence of another string
import java.io.*;
 
class SubSequence {
    // Returns true if str1[] is a subsequence of str2[]
    // m is length of str1 and n is length of str2
    static boolean isSubSequence(String str1, String str2,
                                 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 (str1.charAt(m - 1) == str2.charAt(n - 1))
            return isSubSequence(str1, str2, m - 1, n - 1);
 
        // If last characters are not matching
        return isSubSequence(str1, str2, m, n - 1);
    }
 
    // Driver program
    public static void main(String[] args)
    {
        String str1 = "gksrek";
        String str2 = "geeksforgeeks";
        int m = str1.length();
        int n = str2.length();
        boolean res = isSubSequence(str1, str2, m, n);
        if (res)
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// Contributed by Pramod Kumar


Python3
# Recursive Python program to check
# if a string is subsequence
# of another string
 
# Returns true if str1[] is a
# subsequence of str2[].
 
 
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


C#
// Recursive C# program to check if a string
// is subsequence of another string
using System;
 
class GFG {
 
    // Returns true if str1[] is a
    // subsequence of str2[] m is
    // length of str1 and n is length
    // of str2
    static bool isSubSequence(string str1, string str2,
                              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 (str1[m - 1] == str2[n - 1])
            return isSubSequence(str1, str2, m - 1, n - 1);
 
        // If last characters are not matching
        return isSubSequence(str1, str2, m, n - 1);
    }
 
    // Driver program
    public static void Main()
    {
        string str1 = "gksrek";
        string str2 = "geeksforgeeks";
        int m = str1.Length;
        int n = str2.Length;
        bool res = isSubSequence(str1, str2, m, n);
 
        if (res)
            Console.Write("Yes");
        else
            Console.Write("No");
    }
}
 
// This code is contributed by nitin mittal.


PHP


Javascript


C++
// memoization C++ program to check
// if a string is subsequence
// of another string
#include 
using namespace std;
 
int dp[1001][1001];
 
// returns the length of longest common subsequence
int isSubSequence(string& s1, string& s2, int i, int j)
{
    if (i == 0 || j == 0) {
        return 0;
    }
    if (dp[i][j] != -1) {
        return dp[i][j];
    }
    if (s1[i - 1] == s2[j - 1]) {
        return dp[i][j]
               = 1 + isSubSequence(s1, s2, i - 1, j - 1);
    }
    else {
        return dp[i][j] = isSubSequence(s1, s2, i, j - 1);
    }
}
 
/* Driver program to test above function */
int main()
{
    string str1 = "gksrek";
    string str2 = "geeksforgeeks";
    int m = str1.size();
    int n = str2.size();
    if (m > n) {
        cout << "NO" << endl;
        return 0;
    }
    dp[m][n];
    memset(dp, -1, sizeof(dp));
    if (isSubSequence(str1, str2, m, n) == m) {
        cout << "YES" << endl;
    }
    else {
        cout << "NO" << endl;
    }
    return 0;
}
// this code is contributed by Arun Bang


Python3
# memoization Python program to check
# if a string is subsequence
# of another string
dp = [[-1]*1001]*1001
 
# returns the length of longest common subsequence
def isSubSequence(s1,s2,i,j):
 
   if (i == 0 or j == 0):
      return 0
 
   if (dp[i][j] != -1):
      return dp[i][j]
 
   if (s1[i - 1] == s2[j - 1]):
      dp[i][j] = 1 + isSubSequence(s1, s2, i - 1, j - 1)
      return dp[i][j]
 
   else:
      dp[i][j] = isSubSequence(s1, s2, i, j - 1)
      return dp[i][j]
 
# Driver program to test above function
str1 = "gksrek"
str2 = "geeksforgeeks"
m = len(str1)
n = len(str2)
 
if (m > n):
   print("NO")
 
if (isSubSequence(str1, str2, m, n) == m):
    print("YES")
 
else:
    print("NO")
 
# this code is contributed by shinjanpatra


Javascript


C++
// Iterative C++ program to check
// if a string is subsequence
// of another string
#include 
#include 
using namespace std;
 
// Returns true if str1[] is a
// subsequence of str2[]. m is
// length of str1 and n is length of str2
bool isSubSequence(char str1[], char str2[], int m, int n)
{
    int j = 0; // For index of str1 (or subsequence
 
    // Traverse str2 and str1, and
    // compare current character
    // of str2 with first unmatched char
    // of str1, if matched
    // then move ahead in str1
    for (int i = 0; i < n && j < m; i++)
        if (str1[j] == str2[i])
            j++;
 
    // If all characters of str1 were found in str2
    return (j == m);
}
 
// Driver program to test methods of graph class
int main()
{
    char str1[] = "gksrek";
    char str2[] = "geeksforgeeks";
    int m = strlen(str1);
    int n = strlen(str2);
    isSubSequence(str1, str2, m, n) ? cout << "Yes "
                                    : cout << "No";
    return 0;
}


Java
// Iterative Java program to check if a string
// is subsequence of another string
import java.io.*;
 
class GFG {
 
    // Returns true if str1[] is a subsequence
    // of str2[] m is length of str1 and n is
    // length of str2
    static boolean isSubSequence(String str1, String str2,
                                 int m, int n)
    {
        int j = 0;
 
        // Traverse str2 and str1, and compare
        // current character of str2 with first
        // unmatched char of str1, if matched
        // then move ahead in str1
        for (int i = 0; i < n && j < m; i++)
            if (str1.charAt(j) == str2.charAt(i))
                j++;
 
        // If all characters of str1 were found
        // in str2
        return (j == m);
    }
 
    // Driver program to test methods of
    // graph class
    public static void main(String[] args)
    {
        String str1 = "gksrek";
        String str2 = "geeksforgeeks";
        int m = str1.length();
        int n = str2.length();
        boolean res = isSubSequence(str1, str2, m, n);
 
        if (res)
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by Pramod Kumar


Python3
# Iterative Python program to check if a
# string is subsequence of another string
 
# Returns true if str1 is a subsequence of str2
 
 
def isSubSequence(str1, str2):
    m = len(str1)
    n = len(str2)
 
    j = 0    # Index of str1
    i = 0    # Index of str2
 
    # Traverse both str1 and str2
    # Compare current character of str2 with
    # first unmatched character of str1
    # If matched, then move ahead in str1
 
    while j < m and i < n:
        if str1[j] == str2[i]:
            j = j+1
        i = i + 1
 
    # If all characters of str1 matched,
    # then j is equal to m
    return j == m
 
# Driver Program
 
 
str1 = "gksrek"
str2 = "geeksforgeeks"
 
print ("Yes" if isSubSequence(str1, str2) else "No")
 
# Contributed by Harshit Agrawal


C#
// Iterative C# program to check if a string
// is subsequence of another string
using System;
 
class GFG {
 
    // Returns true if str1[] is a subsequence
    // of str2[] m is length of str1 and n is
    // length of str2
    static bool isSubSequence(string str1, string str2,
                              int m, int n)
    {
        int j = 0;
 
        // Traverse str2 and str1, and compare
        // current character of str2 with first
        // unmatched char of str1, if matched
        // then move ahead in str1
        for (int i = 0; i < n && j < m; i++)
            if (str1[j] == str2[i])
                j++;
 
        // If all characters of str1 were found
        // in str2
        return (j == m);
    }
 
    // Driver program to test methods of
    // graph class
    public static void Main()
    {
        String str1 = "gksrek";
        String str2 = "geeksforgeeks";
        int m = str1.Length;
        int n = str2.Length;
        bool res = isSubSequence(str1, str2, m, n);
 
        if (res)
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by anuj_67.


PHP


Javascript


输出
Yes 

记忆技术

这里的想法是检查最长公共子序列的大小是否等于str1的大小。如果相等,则表示 str2 中存在子序列。下面是使用记忆技术的实现。

C++

// memoization C++ program to check
// if a string is subsequence
// of another string
#include 
using namespace std;
 
int dp[1001][1001];
 
// returns the length of longest common subsequence
int isSubSequence(string& s1, string& s2, int i, int j)
{
    if (i == 0 || j == 0) {
        return 0;
    }
    if (dp[i][j] != -1) {
        return dp[i][j];
    }
    if (s1[i - 1] == s2[j - 1]) {
        return dp[i][j]
               = 1 + isSubSequence(s1, s2, i - 1, j - 1);
    }
    else {
        return dp[i][j] = isSubSequence(s1, s2, i, j - 1);
    }
}
 
/* Driver program to test above function */
int main()
{
    string str1 = "gksrek";
    string str2 = "geeksforgeeks";
    int m = str1.size();
    int n = str2.size();
    if (m > n) {
        cout << "NO" << endl;
        return 0;
    }
    dp[m][n];
    memset(dp, -1, sizeof(dp));
    if (isSubSequence(str1, str2, m, n) == m) {
        cout << "YES" << endl;
    }
    else {
        cout << "NO" << endl;
    }
    return 0;
}
// this code is contributed by Arun Bang

Python3

# memoization Python program to check
# if a string is subsequence
# of another string
dp = [[-1]*1001]*1001
 
# returns the length of longest common subsequence
def isSubSequence(s1,s2,i,j):
 
   if (i == 0 or j == 0):
      return 0
 
   if (dp[i][j] != -1):
      return dp[i][j]
 
   if (s1[i - 1] == s2[j - 1]):
      dp[i][j] = 1 + isSubSequence(s1, s2, i - 1, j - 1)
      return dp[i][j]
 
   else:
      dp[i][j] = isSubSequence(s1, s2, i, j - 1)
      return dp[i][j]
 
# Driver program to test above function
str1 = "gksrek"
str2 = "geeksforgeeks"
m = len(str1)
n = len(str2)
 
if (m > n):
   print("NO")
 
if (isSubSequence(str1, str2, m, n) == m):
    print("YES")
 
else:
    print("NO")
 
# this code is contributed by shinjanpatra

Javascript


输出
YES

时间复杂度: O(m*n)

以下是迭代实现

C++

// Iterative C++ program to check
// if a string is subsequence
// of another string
#include 
#include 
using namespace std;
 
// Returns true if str1[] is a
// subsequence of str2[]. m is
// length of str1 and n is length of str2
bool isSubSequence(char str1[], char str2[], int m, int n)
{
    int j = 0; // For index of str1 (or subsequence
 
    // Traverse str2 and str1, and
    // compare current character
    // of str2 with first unmatched char
    // of str1, if matched
    // then move ahead in str1
    for (int i = 0; i < n && j < m; i++)
        if (str1[j] == str2[i])
            j++;
 
    // If all characters of str1 were found in str2
    return (j == m);
}
 
// Driver program to test methods of graph class
int main()
{
    char str1[] = "gksrek";
    char str2[] = "geeksforgeeks";
    int m = strlen(str1);
    int n = strlen(str2);
    isSubSequence(str1, str2, m, n) ? cout << "Yes "
                                    : cout << "No";
    return 0;
}

Java

// Iterative Java program to check if a string
// is subsequence of another string
import java.io.*;
 
class GFG {
 
    // Returns true if str1[] is a subsequence
    // of str2[] m is length of str1 and n is
    // length of str2
    static boolean isSubSequence(String str1, String str2,
                                 int m, int n)
    {
        int j = 0;
 
        // Traverse str2 and str1, and compare
        // current character of str2 with first
        // unmatched char of str1, if matched
        // then move ahead in str1
        for (int i = 0; i < n && j < m; i++)
            if (str1.charAt(j) == str2.charAt(i))
                j++;
 
        // If all characters of str1 were found
        // in str2
        return (j == m);
    }
 
    // Driver program to test methods of
    // graph class
    public static void main(String[] args)
    {
        String str1 = "gksrek";
        String str2 = "geeksforgeeks";
        int m = str1.length();
        int n = str2.length();
        boolean res = isSubSequence(str1, str2, m, n);
 
        if (res)
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by Pramod Kumar

Python3

# Iterative Python program to check if a
# string is subsequence of another string
 
# Returns true if str1 is a subsequence of str2
 
 
def isSubSequence(str1, str2):
    m = len(str1)
    n = len(str2)
 
    j = 0    # Index of str1
    i = 0    # Index of str2
 
    # Traverse both str1 and str2
    # Compare current character of str2 with
    # first unmatched character of str1
    # If matched, then move ahead in str1
 
    while j < m and i < n:
        if str1[j] == str2[i]:
            j = j+1
        i = i + 1
 
    # If all characters of str1 matched,
    # then j is equal to m
    return j == m
 
# Driver Program
 
 
str1 = "gksrek"
str2 = "geeksforgeeks"
 
print ("Yes" if isSubSequence(str1, str2) else "No")
 
# Contributed by Harshit Agrawal

C#

// Iterative C# program to check if a string
// is subsequence of another string
using System;
 
class GFG {
 
    // Returns true if str1[] is a subsequence
    // of str2[] m is length of str1 and n is
    // length of str2
    static bool isSubSequence(string str1, string str2,
                              int m, int n)
    {
        int j = 0;
 
        // Traverse str2 and str1, and compare
        // current character of str2 with first
        // unmatched char of str1, if matched
        // then move ahead in str1
        for (int i = 0; i < n && j < m; i++)
            if (str1[j] == str2[i])
                j++;
 
        // If all characters of str1 were found
        // in str2
        return (j == m);
    }
 
    // Driver program to test methods of
    // graph class
    public static void Main()
    {
        String str1 = "gksrek";
        String str2 = "geeksforgeeks";
        int m = str1.Length;
        int n = str2.Length;
        bool res = isSubSequence(str1, str2, m, n);
 
        if (res)
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by anuj_67.

PHP


Javascript


输出
Yes 

上述实现的时间复杂度为 O(n),其中 n 是 str2 的长度。

询问:Accolite,乐购