给定两个长度相等的字符串A和B ,任务是找到一个索引i ,以使A [0…i]和B [i + 1…n-1]连接在一起时产生回文。如果找不到这样的索引,则打印-1 。
例子:
Input: S1 = “abcdf”, S2 = “sfgba”
Output: 1
S1[0..1] = “ab”, S2[2..n-1] = “gba”
S1 + S2 = “abgba” which is a palindrome.
Input : S1 = “abcda”, S2 = “bacbs”
Output: -1
简单方法:
- 从0迭代到n (字符串的长度),并将第i个字符从S1复制到另一个字符串,假设为S。
- 现在,使用另一个临时字符串Temp并将S2的字符从索引i +1复制到n 。
- 现在检查字符串(S + Temp)是否为回文。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function that returns true if s is palindrome
bool isPalindrome(string s)
{
int i = 0;
int j = s.length() - 1;
while (i < j) {
if (s[i] != s[j])
return false;
i++;
j--;
}
return true;
}
// Function to return the required index
int getIndex(string S1, string S2, int n)
{
string S = "";
for (int i = 0; i < n; i++) {
// Copy the ith character in S
S = S + S1[i];
string Temp = "";
// Copy all the character of string s2 in Temp
for (int j = i + 1; j < n; j++)
Temp += S2[j];
// Check whether the string is palindrome
if (isPalindrome(S + Temp)) {
return i;
}
}
return -1;
}
// Driver code
int main()
{
string S1 = "abcdf", S2 = "sfgba";
int n = S1.length();
cout << getIndex(S1, S2, n);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Function that returns true if s is palindrome
static boolean isPalindrome(String s)
{
int i = 0;
int j = s.length() - 1;
while (i < j)
{
if (s.charAt(i) != s.charAt(j))
return false;
i++;
j--;
}
return true;
}
// Function to return the required index
static int getIndex(String S1, String S2, int n)
{
String S = "";
for (int i = 0; i < n; i++)
{
// Copy the ith character in S
S = S + S1.charAt(i);
String Temp = "";
// Copy all the character of string
// s2 in Temp
for (int j = i + 1; j < n; j++)
Temp += S2.charAt(j);
// Check whether the string is palindrome
if (isPalindrome(S + Temp))
{
return i;
}
}
return -1;
}
// Driver code
public static void main(String[] args)
{
String S1 = "abcdf", S2 = "sfgba";
int n = S1.length();
System.out.println(getIndex(S1, S2, n));
}
}
// This code is contributed by Code_Mech.
Python3
# Python3 implementation of the approach
# Function that returns true if s is palindrome
def isPalindrome(s):
i = 0;
j = len(s) - 1;
while (i < j):
if (s[i] is not s[j]):
return False;
i += 1;
j -= 1;
return True;
# Function to return the required index
def getIndex(S1, S2, n):
S = "";
for i in range(n):
# Copy the ith character in S
S = S + S1[i];
Temp = "";
# Copy all the character of string s2 in Temp
for j in range(i + 1, n):
Temp += S2[j];
# Check whether the string is palindrome
if (isPalindrome(S + Temp)):
return i;
return -1;
# Driver code
S1 = "abcdf"; S2 = "sfgba";
n = len(S1);
print(getIndex(S1, S2, n));
# This code is contributed by Rajput-Ji
C#
// C# implementation of the approach
using System;
class GFG
{
// Function that returns true if
// s is palindrome
static bool isPalindrome(string s)
{
int i = 0;
int j = s.Length - 1;
while (i < j)
{
if (s[i] != s[j])
return false;
i++;
j--;
}
return true;
}
// Function to return the required index
static int getIndex(string S1,
string S2, int n)
{
string S = "";
for (int i = 0; i < n; i++)
{
// Copy the ith character in S
S = S + S1[i];
string Temp = "";
// Copy all the character of string
// s2 in Temp
for (int j = i + 1; j < n; j++)
Temp += S2[j];
// Check whether the string
// is palindrome
if (isPalindrome(S + Temp))
{
return i;
}
}
return -1;
}
// Driver code
public static void Main()
{
string S1 = "abcdf", S2 = "sfgba";
int n = S1.Length;
Console.WriteLine(getIndex(S1, S2, n));
}
}
// This code is contributed by Code_Mech.
PHP
C++
// C++ program to implement the
// above approach
#include
using namespace std;
// Function that returns true if the sub-string
// starting from index i and ending at index j
// is a palindrome
bool isPalindrome(string s, int i, int j)
{
while (i < j) {
if (s[i] != s[j])
return false;
i++;
j--;
}
return true;
}
// Function to get the required index
int getIndex(string s1, string s2, int len)
{
int i = 0, j = len - 1;
// Start comparing the two strings
// from both ends.
while (i < j) {
// Break from the loop at first mismatch
if (s1[i] != s2[j]) {
break;
}
i++;
j--;
}
// If it is possible to concatenate
// the strings to form palindrome,
// return index
if (i == j) {
return i - 1;
}
// If remaining part for s2
// is palindrome
else if (isPalindrome(s2, i, j))
return i - 1;
// If remaining part for s1
// is palindrome
else if (isPalindrome(s1, i, j))
return j;
// If not possible, return -1
return -1;
}
// Driver Code
int main()
{
string s1 = "abcdf", s2 = "sfgba";
int len = s1.length();
cout << getIndex(s1, s2, len);
return 0;
}
Java
// Java implementation of the above approach
class GFG
{
// Function that returns true if the sub-String
// starting from index i and ending at index j
// is a palindrome
static boolean isPalindrome(String s, int i, int j)
{
while (i < j)
{
if (s.charAt(i) != s.charAt(j))
return false;
i++;
j--;
}
return true;
}
// Function to get the required index
static int getIndex(String s1, String s2, int len)
{
int i = 0, j = len - 1;
// Start comparing the two Strings
// from both ends.
while (i < j)
{
// Break from the loop at first mismatch
if (s1.charAt(i) != s2.charAt(j))
{
break;
}
i++;
j--;
}
// If it is possible to concatenate
// the Strings to form palindrome,
// return index
if (i == j)
{
return i - 1;
}
// If remaining part for s2
// is palindrome
else if (isPalindrome(s2, i, j))
return i - 1;
// If remaining part for s1
// is palindrome
else if (isPalindrome(s1, i, j))
return j;
// If not possible, return -1
return -1;
}
// Driver Code
public static void main(String args[])
{
String s1 = "abcdf", s2 = "sfgba";
int len = s1.length();
System.out.println( getIndex(s1, s2, len));
}
}
// This code is contributed by Arnab Kundu
Python3
# Python3 program to implement the
# above approach
# Function that returns true if the sub-string
# starting from index i and ending at index j
# is a palindrome
def isPalindrome(s, i, j) :
while (i < j) :
if (s[i] != s[j]) :
return False;
i += 1;
j -= 1;
return True;
# Function to get the required index
def getIndex(s1, s2, length) :
i = 0 ; j = length - 1;
# Start comparing the two strings
# from both ends.
while (i < j) :
# Break from the loop at first mismatch
if (s1[i] != s2[j]) :
break;
i += 1;
j -= 1;
# If it is possible to concatenate
# the strings to form palindrome,
# return index
if (i == j) :
return i - 1;
# If remaining part for s2
# is palindrome
elif (isPalindrome(s2, i, j)) :
return i - 1;
# If remaining part for s1
# is palindrome
elif (isPalindrome(s1, i, j)) :
return j;
# If not possible, return -1
return -1;
# Driver Code
if __name__ == "__main__" :
s1 = "abcdf" ;
s2 = "sfgba";
length = len(s1) ;
print(getIndex(s1, s2, length));
# This code is contributed by Ryuga
C#
// C# implementation of the above approach
using System;
class GFG
{
// Function that returns true if the sub-String
// starting from index i and ending at index j
// is a palindrome
static bool isPalindrome(string s,
int i, int j)
{
while (i < j)
{
if (s[i] != s[j])
return false;
i++;
j--;
}
return true;
}
// Function to get the required index
static int getIndex(string s1, string s2, int len)
{
int i = 0, j = len - 1;
// Start comparing the two Strings
// from both ends.
while (i < j)
{
// Break from the loop at first
// mismatch
if (s1[i] != s2[j])
{
break;
}
i++;
j--;
}
// If it is possible to concatenate
// the Strings to form palindrome,
// return index
if (i == j)
{
return i - 1;
}
// If remaining part for s2
// is palindrome
else if (isPalindrome(s2, i, j))
return i - 1;
// If remaining part for s1
// is palindrome
else if (isPalindrome(s1, i, j))
return j;
// If not possible, return -1
return -1;
}
// Driver Code
public static void Main()
{
string s1 = "abcdf", s2 = "sfgba";
int len = s1.Length;
Console.WriteLine(getIndex(s1, s2, len));
}
}
// This code is contributed by Code_Mech.
输出:
1
时间复杂度: O(n 2 )
有效的做法:将有效的方法将是观察到连接字符串将回文如果与第二个字符串的最后一个字符,我们正在考虑第一字符串和第二字符串的后缀的第一个前缀字符串匹配的第一个字符。
- 从指针i的开头开始迭代第一个字符串,从指针j的结尾开始迭代第二个字符串,直到i
和s1 [i] == s2 [j]为止。 - 在第一次不匹配时检查指针i和j是否相等。
- 如果是,则返回索引i,即我们可以将字符串s1 [0..i]和s2 [j..N]连接起来形成回文。
- 否则,检查s1 [i..j]或s2 [i..j]是回文。如果是,那么我们仍然可以将s1 [0..j] + s2 [j + 1,N-1]或s1 [0..i-1] + s2 [i..N-1]连接起来,形成一个回文。
- 否则,返回-1。
下面是上述方法的实现:
C++
// C++ program to implement the
// above approach
#include
using namespace std;
// Function that returns true if the sub-string
// starting from index i and ending at index j
// is a palindrome
bool isPalindrome(string s, int i, int j)
{
while (i < j) {
if (s[i] != s[j])
return false;
i++;
j--;
}
return true;
}
// Function to get the required index
int getIndex(string s1, string s2, int len)
{
int i = 0, j = len - 1;
// Start comparing the two strings
// from both ends.
while (i < j) {
// Break from the loop at first mismatch
if (s1[i] != s2[j]) {
break;
}
i++;
j--;
}
// If it is possible to concatenate
// the strings to form palindrome,
// return index
if (i == j) {
return i - 1;
}
// If remaining part for s2
// is palindrome
else if (isPalindrome(s2, i, j))
return i - 1;
// If remaining part for s1
// is palindrome
else if (isPalindrome(s1, i, j))
return j;
// If not possible, return -1
return -1;
}
// Driver Code
int main()
{
string s1 = "abcdf", s2 = "sfgba";
int len = s1.length();
cout << getIndex(s1, s2, len);
return 0;
}
Java
// Java implementation of the above approach
class GFG
{
// Function that returns true if the sub-String
// starting from index i and ending at index j
// is a palindrome
static boolean isPalindrome(String s, int i, int j)
{
while (i < j)
{
if (s.charAt(i) != s.charAt(j))
return false;
i++;
j--;
}
return true;
}
// Function to get the required index
static int getIndex(String s1, String s2, int len)
{
int i = 0, j = len - 1;
// Start comparing the two Strings
// from both ends.
while (i < j)
{
// Break from the loop at first mismatch
if (s1.charAt(i) != s2.charAt(j))
{
break;
}
i++;
j--;
}
// If it is possible to concatenate
// the Strings to form palindrome,
// return index
if (i == j)
{
return i - 1;
}
// If remaining part for s2
// is palindrome
else if (isPalindrome(s2, i, j))
return i - 1;
// If remaining part for s1
// is palindrome
else if (isPalindrome(s1, i, j))
return j;
// If not possible, return -1
return -1;
}
// Driver Code
public static void main(String args[])
{
String s1 = "abcdf", s2 = "sfgba";
int len = s1.length();
System.out.println( getIndex(s1, s2, len));
}
}
// This code is contributed by Arnab Kundu
Python3
# Python3 program to implement the
# above approach
# Function that returns true if the sub-string
# starting from index i and ending at index j
# is a palindrome
def isPalindrome(s, i, j) :
while (i < j) :
if (s[i] != s[j]) :
return False;
i += 1;
j -= 1;
return True;
# Function to get the required index
def getIndex(s1, s2, length) :
i = 0 ; j = length - 1;
# Start comparing the two strings
# from both ends.
while (i < j) :
# Break from the loop at first mismatch
if (s1[i] != s2[j]) :
break;
i += 1;
j -= 1;
# If it is possible to concatenate
# the strings to form palindrome,
# return index
if (i == j) :
return i - 1;
# If remaining part for s2
# is palindrome
elif (isPalindrome(s2, i, j)) :
return i - 1;
# If remaining part for s1
# is palindrome
elif (isPalindrome(s1, i, j)) :
return j;
# If not possible, return -1
return -1;
# Driver Code
if __name__ == "__main__" :
s1 = "abcdf" ;
s2 = "sfgba";
length = len(s1) ;
print(getIndex(s1, s2, length));
# This code is contributed by Ryuga
C#
// C# implementation of the above approach
using System;
class GFG
{
// Function that returns true if the sub-String
// starting from index i and ending at index j
// is a palindrome
static bool isPalindrome(string s,
int i, int j)
{
while (i < j)
{
if (s[i] != s[j])
return false;
i++;
j--;
}
return true;
}
// Function to get the required index
static int getIndex(string s1, string s2, int len)
{
int i = 0, j = len - 1;
// Start comparing the two Strings
// from both ends.
while (i < j)
{
// Break from the loop at first
// mismatch
if (s1[i] != s2[j])
{
break;
}
i++;
j--;
}
// If it is possible to concatenate
// the Strings to form palindrome,
// return index
if (i == j)
{
return i - 1;
}
// If remaining part for s2
// is palindrome
else if (isPalindrome(s2, i, j))
return i - 1;
// If remaining part for s1
// is palindrome
else if (isPalindrome(s1, i, j))
return j;
// If not possible, return -1
return -1;
}
// Driver Code
public static void Main()
{
string s1 = "abcdf", s2 = "sfgba";
int len = s1.Length;
Console.WriteLine(getIndex(s1, s2, len));
}
}
// This code is contributed by Code_Mech.
输出:
1
时间复杂度:O(N),其中N是字符串的长度。