📜  形成最短回文的最小插入

📅  最后修改于: 2022-05-13 01:57:07.609000             🧑  作者: Mango

形成最短回文的最小插入

给定一个字符串S,确定应该添加到 S 左侧的最少字符数,以使完整的字符串成为回文。

例子:

Input: S = "LOL"
Output: 0
LOL is already a palindrome

Input: S = "JAVA"
Output: 3
We need to add 3 characters to form AVAJAVA.

这个想法是找到给定字符串的最长回文前缀。前缀后的字符数就是我们的答案。最长回文前缀可以通过从最后一个字符循环到第一个字符来找到。例如,在“Java”中,最长的回文前缀是“J”,所以我们需要在开头的字符处添加剩余的3个字符来形成回文。

C++
// C++ program to find minimum number of insertions
// on left side to form a palindrome.
 
#include 
using namespace std;
 
// Returns true if a string str[st..end] is palindrome
bool isPalin(char str[], int st, int end)
{
    while (st < end)
    {
        if (str[st] != str[end])
            return false;
        st++;
        end--;
    }
    return true;
}
 
// Returns count of insertions on left side to make
// str[] a palindrome
int findMinInsert(char str[], int n)
{
    // Find the largest prefix of given string
    // that is palindrome.
    for (int i=n-1; i>=0; i--)
    {        
        // Characters after the palindromic prefix
        // must be added at the beginning also to make
        // the complete string palindrome
        if (isPalin(str, 0, i))
            return (n-i-1);
    }
}
 
// Driver program
int main()
{
    char Input[] = "JAVA";
    printf("%d", findMinInsert(Input, strlen(Input)));
    return 0;
}


Java
// Java program to find minimum number
// of insertions on left side to form
// a palindrome.
import java.util.*;
  
class GFG{
   
// Returns true if a string
// str[st..end] is palindrome
static boolean isPalin(char []str, int st,
                                   int end)
{
    while (st < end)
    {
        if (str[st] != str[end])
            return false;
              
        st++;
        end--;
    }
    return true;
}
   
// Returns count of insertions on
// left side to make str[] a palindrome
static int findMinInsert(char []str, int n)
{
     
    // Find the largest prefix of given
    // string that is palindrome.
    for(int i = n - 1; i >= 0; i--)
    {
         
        // Characters after the palindromic
        // prefix must be added at the
        // beginning also to make the
        // complete string palindrome
        if (isPalin(str, 0, i))
            return (n - i - 1);
    }
    return 0;
}
   
// Driver Code
public static void main(String []args)
{
    char []Input = "JAVA".toCharArray();
      
    System.out.println(findMinInsert(Input,
                                     Input.length));
}
}
  
// This code is contributed by pratham76


Python3
# Python3 program to find
# minimum number of insertions
# on left side to form a palindrome.
 
# Returns true if a string
# str[st..end] is palindrome
def isPalin(str, st, end):
 
    while (st < end):
     
        if (str[st] != str[end]):
            return False
        st += 1
        end--1
     
    return True
 
 
# Returns count of insertions
# on left side to make
# str[] a palindrome
def findMinInsert(str, n):
 
    # Find the largest
    # prefix of given string
    # that is palindrome.
    for i in range(n-1 ,-1, -1):
             
        # Characters after the
        # palindromic prefix must
        # be added at the beginning
        # also to make the complete
        # string palindrome
        if (isPalin(str, 0, i)):
            return (n - i - 1)
 
# Driver Code
Input = "JAVA"
print(findMinInsert(Input,
                    len(Input)))
 
# This code is contributed
# by Smitha


C#
// C# program to find minimum number
// of insertions on left side to form
// a palindrome.
using System;
using System.Text;
 
class GFG{
  
// Returns true if a string
// str[st..end] is palindrome
static bool isPalin(char []str, int st,
                                int end)
{
    while (st < end)
    {
        if (str[st] != str[end])
            return false;
             
        st++;
        end--;
    }
    return true;
}
  
// Returns count of insertions on
// left side to make str[] a palindrome
static int findMinInsert(char []str, int n)
{
     
    // Find the largest prefix of given string
    // that is palindrome.
    for(int i = n - 1; i >= 0; i--)
    {
         
        // Characters after the palindromic
        // prefix must be added at the
        // beginning also to make the
        // complete string palindrome
        if (isPalin(str, 0, i))
            return (n - i - 1);
    }
    return 0;
}
  
// Driver Code
public static void Main(string []args)
{
    char []Input = "JAVA".ToCharArray();
     
    Console.Write(findMinInsert(Input,
                                Input.Length));
}
}
 
// This code is contributed by rutvik_56


Javascript


输出:

3

时间复杂度: O(n 2 )