给定两个长度为N 的字符串A和B ,任务是检查通过在任何索引i (0 ≤ i ≤ N – 1) 处拆分这两个字符串并连接A[0, i]和B形成的两个字符串是否有任何一个[i, N – 1]或A[i, N – 1]和B[0, i]分别形成或不形成回文字符串。如果发现是真的,打印“是” 。否则,打印“否” 。
例子:
Input: A = “x”, B = “y”
Output: Yes
Explanation:
Let the string be spitted at index 0 then,
Split A from index 0: “”+”x” A[0, 0] = “” and A[1, 1] = “x”.
Split B from index 0: “”+”y” B[0, 0] = “” and B[1, 1] = “y”.
The concatenation of A[0, 0] and B[1, 1] is = “y” which is a palindromic string.
Input: A = “xbdef”, B = “xecab”
Output: No
方法:想法是使用双指针技术并在[0, N – 1]范围内遍历字符串,并检查子串A[0, i – 1]和B[i, N – 1]或子串A[i, N – 1]和B[0, i – 1]的串联是否是回文。如果发现任何串联是回文,则打印“是”,否则打印“否” 。
下面是上述方法的实现:
C++
// C++ Program to implement
// the above approach
#include
using namespace std;
// Function to check if a string
// is palindrome or not
bool isPalindrome(string str)
{
// Start and end of the
// string
int i = 0, j = str.size() - 1;
// Iterate the string
// until i > j
while (i < j)
{
// If there is a mismatch
if (str[i] != str[j])
return false;
// Increment first pointer
// and decrement the other
i++;
j--;
}
// Given string is a
// palindrome
return true;
}
// Function two check if
// the strings can be
// combined to form a palindrome
void formPalindrome(string a,
string b, int n)
{
// Initialize array of
// characters
char aa[n + 2];
char bb[n + 2];
for (int i = 0; i < n + 2; i++)
{
aa[i] = ' ';
bb[i] = ' ';
}
// Stores character of string
// in the character array
for (int i = 1; i <= n; i++)
{
aa[i] = a[i - 1];
bb[i] = b[i - 1];
}
bool ok = false;
for (int i = 0; i <= n + 1; i++)
{
// Find left and right parts
// of strings a and b
string la = "";
string ra = "";
string lb = "";
string rb = "";
for (int j = 1; j <= i - 1; j++)
{
// Substring a[j...i-1]
if (aa[j] == ' ')
la += "";
else
la += aa[j];
// Substring b[j...i-1]
if (bb[j] == ' ')
lb += "";
else
lb += bb[j];
}
for (int j = i; j <= n + 1; j++)
{
// Substring a[i...n]
if (aa[j] == ' ')
ra += "";
else
ra += aa[j];
// Substring b[i...n]
if (bb[j] == ' ')
rb += "";
else
rb += bb[j];
}
// Check is left part of a +
// right part of b or vice
// versa is a palindrome
if (isPalindrome(la + rb) ||
isPalindrome(lb + ra))
{
ok = true;
break;
}
}
// Print the result
if (ok)
cout << ("Yes");
// Otherwise
else
cout << ("No");
}
// Driver Code
int main()
{
string A = "bdea";
string B = "abbb";
int N = 4;
formPalindrome(A, B, N);
}
// This code is contributed by gauravrajput1
Java
// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG {
// Function to check if a string
// is palindrome or not
static boolean isPalindrome(String str)
{
// Start and end of the string
int i = 0, j = str.length() - 1;
// Iterate the string until i > j
while (i < j) {
// If there is a mismatch
if (str.charAt(i)
!= str.charAt(j))
return false;
// Increment first pointer and
// decrement the other
i++;
j--;
}
// Given string is a palindrome
return true;
}
// Function two check if the strings can
// be combined to form a palindrome
static void formPalindrome(
String a, String b, int n)
{
// Initialize array of characters
char aa[] = new char[n + 2];
char bb[] = new char[n + 2];
Arrays.fill(aa, ' ');
Arrays.fill(bb, ' ');
// Stores character of string
// in the character array
for (int i = 1; i <= n; i++) {
aa[i] = a.charAt(i - 1);
bb[i] = b.charAt(i - 1);
}
boolean ok = false;
for (int i = 0; i <= n + 1; i++) {
// Find left and right parts
// of strings a and b
StringBuilder la
= new StringBuilder();
StringBuilder ra
= new StringBuilder();
StringBuilder lb
= new StringBuilder();
StringBuilder rb
= new StringBuilder();
for (int j = 1;
j <= i - 1; j++) {
// Substring a[j...i-1]
la.append((aa[j] == ' ')
? ""
: aa[j]);
// Substring b[j...i-1]
lb.append((bb[j] == ' ')
? ""
: bb[j]);
}
for (int j = i;
j <= n + 1; j++) {
// Substring a[i...n]
ra.append((aa[j] == ' ')
? ""
: aa[j]);
// Substring b[i...n]
rb.append((bb[j] == ' ')
? ""
: bb[j]);
}
// Check is left part of a +
// right part of b or vice
// versa is a palindrome
if (isPalindrome(la.toString()
+ rb.toString())
|| isPalindrome(lb.toString()
+ ra.toString())) {
ok = true;
break;
}
}
// Print the result
if (ok)
System.out.println("Yes");
// Otherwise
else
System.out.println("No");
}
// Driver Code
public static void main(String[] args)
{
String A = "bdea";
String B = "abbb";
int N = 4;
formPalindrome(A, B, N);
}
}
Python3
# Python3 program for the
# above approach
# Function to check if
# a string is palindrome
# or not
def isPalindrome(st):
# Start and end of
# the string
i = 0
j = len(st) - 1
# Iterate the string
# until i > j
while (i < j):
# If there is a mismatch
if (st[i] != st[j]):
return False
# Increment first pointer
# and decrement the other
i += 1
j -= 1
# Given string is a
# palindrome
return True
# Function two check if
# the strings can be
# combined to form a
# palindrome
def formPalindrome(a, b, n):
# Initialize array of
# characters
aa = [' '] * (n + 2)
bb = [' '] * (n + 2)
# Stores character of string
# in the character array
for i in range(1, n + 1):
aa[i] = a[i - 1]
bb[i] = b[i - 1]
ok = False
for i in range(n + 2):
# Find left and right parts
# of strings a and b
la = ""
ra = ""
lb = ""
rb = ""
for j in range(1, i):
# Substring a[j...i-1]
if (aa[j] == ' '):
la += ""
else:
la += aa[j]
# Substring b[j...i-1]
if (bb[j] == ' '):
lb += ""
else:
lb += bb[j]
for j in range(i, n + 2):
# Substring a[i...n]
if (aa[j] == ' '):
ra += ""
else:
ra += aa[j]
# Substring b[i...n]
if (bb[j] == ' '):
rb += ""
else:
rb += bb[j]
# Check is left part of a +
# right part of b or vice
# versa is a palindrome
if (isPalindrome(str(la) +
str(rb))
or isPalindrome(str(lb) +
str(ra))):
ok = True
break
# Print the result
if (ok):
print("Yes")
# Otherwise
else:
print("No")
# Driver Code
if __name__ == "__main__":
A = "bdea"
B = "abbb"
N = 4
formPalindrome(A, B, N)
# This code is contributed by Chitranayal
C#
// C# program for the
// above approach
using System;
using System.Text;
class GFG{
// Function to check if a string
// is palindrome or not
static bool isPalindrome(String str)
{
// Start and end of the string
int i = 0, j = str.Length - 1;
// Iterate the string
// until i > j
while (i < j)
{
// If there is a mismatch
if (str[i] != str[j])
return false;
// Increment first pointer
// and decrement the other
i++;
j--;
}
// Given string is
// a palindrome
return true;
}
// Function two check if the strings can
// be combined to form a palindrome
static void formPalindrome(String a,
String b, int n)
{
// Initialize array of
// characters
char []aa = new char[n + 2];
char []bb = new char[n + 2];
for(int i = 0; i < n + 2; i++)
{
aa[i] = ' ';
bb[i] = ' ';
}
// Stores character of string
// in the character array
for (int i = 1; i <= n; i++)
{
aa[i] = a[i-1];
bb[i] = b[i-1];
}
bool ok = false;
for (int i = 0;
i <= n + 1; i++)
{
// Find left and right parts
// of strings a and b
StringBuilder la =
new StringBuilder();
StringBuilder ra =
new StringBuilder();
StringBuilder lb =
new StringBuilder();
StringBuilder rb =
new StringBuilder();
for (int j = 1;
j <= i - 1; j++)
{
// Substring a[j...i-1]
la.Append((aa[j] == ' ') ?
' ' : aa[j]);
// Substring b[j...i-1]
lb.Append((bb[j] == ' ') ?
' ' : bb[j]);
}
for (int j = i;
j <= n + 1; j++)
{
// Substring a[i...n]
ra.Append((aa[j] == ' ') ?
' ' : aa[j]);
// Substring b[i...n]
rb.Append((bb[j] == ' ') ?
' ' : bb[j]);
}
// Check is left part of a +
// right part of b or vice
// versa is a palindrome
if (isPalindrome(la.ToString() +
rb.ToString()) ||
isPalindrome(lb.ToString() +
ra.ToString()))
{
ok = true;
break;
}
}
// Print the result
if (!ok)
Console.WriteLine("Yes");
// Otherwise
else
Console.WriteLine("No");
}
// Driver Code
public static void Main(String[] args)
{
String A = "bdea";
String B = "abbb";
int N = 4;
formPalindrome(A, B, N);
}
}
// This code is contributed by 29AjayKumar
Javascript
C++
// C++ program to implement
// the above approach
#include
using namespace std;
string rev(string str)
{
int st = 0;
int ed = str.length() - 1;
string s = str;
while(st < ed)
{
swap(s[st],
s[ed]);
st++;
ed--;
}
return s;
}
bool check(string a,
string b, int n)
{
int i = 0;
int j = n - 1;
// iterate through the
// length if we could
// find a[i]==b[j] we could
// increment I and decrement j
while(i < n)
{
if(a[i] != b[j])
break;
// else we could just break
// the loop as its not a
// palindrome type sequence
i += 1;
j -= 1;
// we could concatenate the
// a's left part +b's right
// part in a variable a and
// a's right part+b's left
// in the variable b
string xa = a.substr(i, j + 1 - i);
string xb = b.substr(i, j + 1 - i);
// we would check for the
// palindrome condition if
// yes we print True else False
if((xa == rev(xa)) or
(xb == rev(xb)))
return true;
}
return false;
}
// Driver code
int main()
{
string a = "xbdef";
string b = "cabex";
if (check(a, b,
a.length()) == true or
check(b, a,
a.length()) == true)
cout << "True";
else
cout << "False";
}
// This code is contributed by Surendra_Gangwar
Java
// Java program to implement
// the above approach
import java.util.*;
import java.io.*;
class GFG{
public static String rev(String str)
{
int st = 0;
int ed = str.length() - 1;
char[] s = str.toCharArray();
while(st < ed)
{
char temp = s[st];
s[st] = s[ed];
s[ed] = temp;
st++;
ed--;
}
return (s.toString());
}
public static boolean check(String a,
String b, int n)
{
int i = 0;
int j = n - 1;
// Iterate through the
// length if we could
// find a[i]==b[j] we could
// increment I and decrement j
while(i < n)
{
if (a.charAt(i) != b.charAt(j))
break;
// Else we could just break
// the loop as its not a
// palindrome type sequence
i += 1;
j -= 1;
// We could concatenate the
// a's left part +b's right
// part in a variable a and
// a's right part+b's left
// in the variable b
String xa = a.substring(i, j + 1);
String xb = b.substring(i, j + 1);
// We would check for the
// palindrome condition if
// yes we print True else False
StringBuffer XA = new StringBuffer(xa);
XA.reverse();
StringBuffer XB = new StringBuffer(xb);
XB.reverse();
if (xa == XA.toString() ||
xb == XB.toString())
{
return true;
}
}
return false;
}
// Driver Code
public static void main(String[] args)
{
String a = "xbdef";
String b = "cabex";
if (check(a, b, a.length()) ||
check(b, a, a.length()))
System.out.println("True");
else
System.out.println("False");
}
}
// This code is contributed by divyesh072019
Python3
# Python3 program to implement
# the above approach
def check(a, b, n):
i, j = 0, n - 1
# iterate through the length if
# we could find a[i]==b[j] we could
# increment I and decrement j
while(i < n):
if(a[i] != b[j]):
# else we could just break
# the loop as its not a palindrome
# type sequence
break
i += 1
j -= 1
# we could concatenate the a's left part
# +b's right part in a variable a and a's
# right part+b's left in the variable b
xa = a[i:j+1]
xb = b[i:j+1]
# we would check for the palindrome condition
# if yes we print True else False
if(xa == xa[::-1] or xb == xb[::-1]):
return True
a = "xbdef"
b = "cabex"
if check(a, b, len(a)) == True or check(b, a, len(a)) == True:
print(True)
else:
print(False)
# CODE CONTRIBUTED BY SAIKUMAR KUDIKALA
C#
// C# program to implement
// the above approach
using System;
class GFG {
static string rev(string str)
{
int st = 0;
int ed = str.Length - 1;
char[] s = str.ToCharArray();
while(st < ed)
{
char temp = s[st];
s[st] = s[ed];
s[ed] = temp;
st++;
ed--;
}
return new string(s);
}
static bool check(string a,
string b, int n)
{
int i = 0;
int j = n - 1;
// iterate through the
// length if we could
// find a[i]==b[j] we could
// increment I and decrement j
while(i < n)
{
if(a[i] != b[j])
break;
// else we could just break
// the loop as its not a
// palindrome type sequence
i += 1;
j -= 1;
// we could concatenate the
// a's left part +b's right
// part in a variable a and
// a's right part+b's left
// in the variable b
string xa = a.Substring(i, j + 1 - i);
string xb = b.Substring(i, j + 1 - i);
// we would check for the
// palindrome condition if
// yes we print True else False
char[] XA = xa.ToCharArray();
Array.Reverse(XA);
char[] XB = xb.ToCharArray();
Array.Reverse(XB);
if(string.Compare(xa, new string(XA)) == 0 ||
string.Compare(xb, new string(XB)) == 0)
return true;
}
return false;
}
// Driver code
static void Main()
{
string a = "xbdef";
string b = "cabex";
if (check(a, b, a.Length) || check(b, a, a.Length))
Console.WriteLine("True");
else
Console.WriteLine("False");
}
}
// This code is contributed by divyeshrabadiya07
Yes
时间复杂度: O(N 2 ) 其中 N 是给定字符串的长度。
辅助空间: O(N)
替代Python方法(两个指针 + 切片):
这种方法遵循以下路径:
- 定义函数检查
- 分别取0、n-1位置的两个指针i,j
- 如果 a 的第一个字符和 b 的第二个字符不匹配,我们会中断(因为我们正在搜索回文)
- 如果匹配,我们只需增加指针
- 我们将连接第一个字符串的a[i:j+1] 和第二个字符串的b[i:j+1] 并检查回文的条件
- 如果是,我们返回 True
C++
// C++ program to implement
// the above approach
#include
using namespace std;
string rev(string str)
{
int st = 0;
int ed = str.length() - 1;
string s = str;
while(st < ed)
{
swap(s[st],
s[ed]);
st++;
ed--;
}
return s;
}
bool check(string a,
string b, int n)
{
int i = 0;
int j = n - 1;
// iterate through the
// length if we could
// find a[i]==b[j] we could
// increment I and decrement j
while(i < n)
{
if(a[i] != b[j])
break;
// else we could just break
// the loop as its not a
// palindrome type sequence
i += 1;
j -= 1;
// we could concatenate the
// a's left part +b's right
// part in a variable a and
// a's right part+b's left
// in the variable b
string xa = a.substr(i, j + 1 - i);
string xb = b.substr(i, j + 1 - i);
// we would check for the
// palindrome condition if
// yes we print True else False
if((xa == rev(xa)) or
(xb == rev(xb)))
return true;
}
return false;
}
// Driver code
int main()
{
string a = "xbdef";
string b = "cabex";
if (check(a, b,
a.length()) == true or
check(b, a,
a.length()) == true)
cout << "True";
else
cout << "False";
}
// This code is contributed by Surendra_Gangwar
Java
// Java program to implement
// the above approach
import java.util.*;
import java.io.*;
class GFG{
public static String rev(String str)
{
int st = 0;
int ed = str.length() - 1;
char[] s = str.toCharArray();
while(st < ed)
{
char temp = s[st];
s[st] = s[ed];
s[ed] = temp;
st++;
ed--;
}
return (s.toString());
}
public static boolean check(String a,
String b, int n)
{
int i = 0;
int j = n - 1;
// Iterate through the
// length if we could
// find a[i]==b[j] we could
// increment I and decrement j
while(i < n)
{
if (a.charAt(i) != b.charAt(j))
break;
// Else we could just break
// the loop as its not a
// palindrome type sequence
i += 1;
j -= 1;
// We could concatenate the
// a's left part +b's right
// part in a variable a and
// a's right part+b's left
// in the variable b
String xa = a.substring(i, j + 1);
String xb = b.substring(i, j + 1);
// We would check for the
// palindrome condition if
// yes we print True else False
StringBuffer XA = new StringBuffer(xa);
XA.reverse();
StringBuffer XB = new StringBuffer(xb);
XB.reverse();
if (xa == XA.toString() ||
xb == XB.toString())
{
return true;
}
}
return false;
}
// Driver Code
public static void main(String[] args)
{
String a = "xbdef";
String b = "cabex";
if (check(a, b, a.length()) ||
check(b, a, a.length()))
System.out.println("True");
else
System.out.println("False");
}
}
// This code is contributed by divyesh072019
蟒蛇3
# Python3 program to implement
# the above approach
def check(a, b, n):
i, j = 0, n - 1
# iterate through the length if
# we could find a[i]==b[j] we could
# increment I and decrement j
while(i < n):
if(a[i] != b[j]):
# else we could just break
# the loop as its not a palindrome
# type sequence
break
i += 1
j -= 1
# we could concatenate the a's left part
# +b's right part in a variable a and a's
# right part+b's left in the variable b
xa = a[i:j+1]
xb = b[i:j+1]
# we would check for the palindrome condition
# if yes we print True else False
if(xa == xa[::-1] or xb == xb[::-1]):
return True
a = "xbdef"
b = "cabex"
if check(a, b, len(a)) == True or check(b, a, len(a)) == True:
print(True)
else:
print(False)
# CODE CONTRIBUTED BY SAIKUMAR KUDIKALA
C#
// C# program to implement
// the above approach
using System;
class GFG {
static string rev(string str)
{
int st = 0;
int ed = str.Length - 1;
char[] s = str.ToCharArray();
while(st < ed)
{
char temp = s[st];
s[st] = s[ed];
s[ed] = temp;
st++;
ed--;
}
return new string(s);
}
static bool check(string a,
string b, int n)
{
int i = 0;
int j = n - 1;
// iterate through the
// length if we could
// find a[i]==b[j] we could
// increment I and decrement j
while(i < n)
{
if(a[i] != b[j])
break;
// else we could just break
// the loop as its not a
// palindrome type sequence
i += 1;
j -= 1;
// we could concatenate the
// a's left part +b's right
// part in a variable a and
// a's right part+b's left
// in the variable b
string xa = a.Substring(i, j + 1 - i);
string xb = b.Substring(i, j + 1 - i);
// we would check for the
// palindrome condition if
// yes we print True else False
char[] XA = xa.ToCharArray();
Array.Reverse(XA);
char[] XB = xb.ToCharArray();
Array.Reverse(XB);
if(string.Compare(xa, new string(XA)) == 0 ||
string.Compare(xb, new string(XB)) == 0)
return true;
}
return false;
}
// Driver code
static void Main()
{
string a = "xbdef";
string b = "cabex";
if (check(a, b, a.Length) || check(b, a, a.Length))
Console.WriteLine("True");
else
Console.WriteLine("False");
}
}
// This code is contributed by divyeshrabadiya07
输出:
False
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live