📌  相关文章
📜  找到索引i,以使S1的前缀和S2的后缀串联在一起,直到我形成回文

📅  最后修改于: 2021-04-27 20:12:48             🧑  作者: Mango

给定两个长度相等的字符串AB ,任务是找到一个索引i ,以使A [0…i]B [i + 1…n-1]连接在一起时产生回文。如果找不到这样的索引,则打印-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是字符串的长度。