给定两个字符串,判断第一个字符串是否是第二个的子序列
给定两个字符串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,乐购