交错两个没有公共字符的给定字符串
给定三个字符串A、B 和 C。编写一个函数来检查 C 是否是 A 和 B 的交错。可以假设 A 和 B 之间没有公共字符(有关处理公共字符的扩展解决方案,请参阅this同样),如果 C 包含 A 和 B 的所有字符并且单个字符串中所有字符的顺序被保留,则称 C 是交错的 A 和 B。有关示例,请参见上一篇文章。
解决方案:
一个接一个地选择 C 的每个字符,并将其与 A 中的第一个字符匹配。如果不匹配,则将其与 B 的第一个字符匹配。如果它甚至不匹配 B 的第一个字符,则返回 false。如果字符与A的第一个字符匹配,则从C的第二个字符,A的第二个字符和B的第一个字符重复上述过程。如果C的第一个字符与B的第一个字符匹配(并且不匹配A) 的第一个字符,然后从 C 的第二个字符、A 的第一个字符和 B 的第二个字符重复上述过程。如果 C 的所有字符都与 A 的字符或 B 的字符匹配,并且 C 的长度为A和B的长度之和,则C是交错的A和B。
C++
// C++ program to check if given string is
// an interleaving of the other two strings
#include
using namespace std;
// Returns true if C is an interleaving of A and B,
// otherwise returns false
bool isInterleaved (char A[], char B[], char C[])
{
// Iterate through all characters of C.
while (*C != 0)
{
// Match first character of C with first character
// of A. If matches them move A to next
if (*A == *C)
A++;
// Else Match first character of C with first
// character of B. If matches them move B to next
else if (*B == *C)
B++;
// If doesn't match with either A or B, then return
// false
else
return false;
// Move C to next for next iteration
C++;
}
// If A or B still have some characters, then length of
// C is smaller than sum of lengths of A and B, so
// return false
if (*A || *B)
return false;
return true;
}
// Driver program to test above functions
int main()
{
char A[] = "AB";
char B[] = "CD";
char C[] = "ACBG";
if (isInterleaved(A, B, C) == true)
cout << C << " is interleaved of " << A << " and " << B;
else
cout << C << " is not interleaved of " << A << " and " << B;
return 0;
}
// This is code is contributed by rathbhupendra
C
// C program to check if given string is an interleaving
// of the other two strings
#include
// Returns true if C is an interleaving of A and B,
// otherwise returns false
bool isInterleaved (char *A, char *B, char *C)
{
// Iterate through all characters of C.
while (*C != 0)
{
// Match first character of C with first character
// of A. If matches them move A to next
if (*A == *C)
A++;
// Else Match first character of C with first
// character of B. If matches them move B to next
else if (*B == *C)
B++;
// If doesn't match with either A or B, then return
// false
else
return false;
// Move C to next for next iteration
C++;
}
// If A or B still have some characters, then length of
// C is smaller than sum of lengths of A and B, so
// return false
if (*A || *B)
return false;
return true;
}
// Driver program to test above functions
int main()
{
char *A = "AB";
char *B = "CD";
char *C = "ACBG";
if (isInterleaved(A, B, C) == true)
printf("%s is interleaved of %s and %s", C, A, B);
else
printf("%s is not interleaved of %s and %s", C, A, B);
return 0;
}
// This code is contributed by Venkat
Java
// Java program to check if the given string is
// an interleaving of the other two strings
public class GfG{
// Returns true if C is an interleaving
// of A and B, otherwise returns false
static boolean isInterleaved (String A, String B, String C)
{
int i = 0, j = 0, k = 0;
// Iterate through all characters of C.
while (k != C.length())
{
// Match first character of C with first character
// of A. If matches them move A to next
if (i
Python3
# Python3 program to check if given string is an interleaving of
# the other two strings
# Returns true if C is an interleaving of A and B, otherwise
# returns false
def isInterleaved(A, B, C):
# Utility variables
i = 0
j = 0
k = 0
# Iterate through all characters of C.
while k != len(C)-1:
# Match first character of C with first character of A,
# If matches them move A to next
if i
C#
// C# program to check if the given string is
// an interleaving of the other two strings
using System;
class GfG
{
// Returns true if C is an interleaving
// of A and B, otherwise returns false
static bool isInterleaved (String A, String B, String C)
{
int i = 0, j = 0, k = 0;
// Iterate through all characters of C.
while (k != C.Length - 1)
{
// Match first character of C with first character
// of A. If matches them move A to next
if (A[i] == C[k])
i++;
// Else Match first character of C with first
// character of B. If matches them move B to next
else if (B[j] == C[k])
j++;
// If doesn't match with either A or B, then return
// false
else
return false;
// Move C to next for next iteration
k++;
}
// If A or B still have some characters,
// then length of C is smaller than sum
// of lengths of A and B, so return false
if (i < A.Length || j < B.Length)
return false;
return true;
}
// Driver code
public static void Main(String []args)
{
String A = "AB";
String B = "CD";
String C = "ACBG";
if (isInterleaved(A, B, C) == true)
Console.WriteLine("{0} is interleaved of {1} and {2}", C, A, B);
else
Console.WriteLine("{0} is not interleaved of {1} and {2}", C, A, B);
}
}
// This code contributed by Rajput-Ji
PHP
Javascript
输出:
ACBG is not interleaved of AB and CD