给定一个字符串S ,任务是在删除最小大小的子字符串后打印字符串,使得S是回文与否。
例子:
Input: S = “pqrstsuvwrqp”
Output: pqrstsrqp
Explanation:
Removal of the substring “uvw” modifies S to a palindromic string.
Input: S = “geeksforskeeg”
Output: geeksfskeeg
Explanation:
Removal of substring “or” modifies S to a palindromic string.
方法:这个想法是从给定的字符串S 中包含最大大小的前缀和后缀,其串联形成一个回文。然后,从本身是回文的剩余字符串选择最大长度的前缀或后缀。下面是在图像的帮助下该方法的说明:
下面是上述方法的实现:
C++
// C++ program of the
// above approach
#include
using namespace std;
// Function to find palindromic
// prefix of maximum length
string palindromePrefix(string S)
{
int n = S.size();
// Finding palindromic prefix of
// maximum length
for (int i = n - 1; i >= 0; i--) {
string curr = S.substr(0, i + 1);
// Checking if curr substring
// is palindrome or not.
int l = 0, r = curr.size() - 1;
bool is_palindrome = 1;
while (l < r) {
if (curr[l] != curr[r]) {
is_palindrome = 0;
break;
}
l++;
r--;
}
// Condition to check if the
// prefix is a palindrome
if (is_palindrome)
return curr;
}
// if no palindrome exist
return "";
}
// Function to find the maximum size
// palindrome such that after removing
// minimum size substring
string maxPalindrome(string S)
{
int n = S.size();
if (n <= 1) {
return S;
}
string pre = "", suff = "";
// Finding prefix and suffix
// of same length
int i = 0, j = n - 1;
while (S[i] == S[j] && i < j) {
i++;
j--;
}
// Matching the ranges
i--;
j++;
pre = S.substr(0, i + 1);
suff = S.substr(j);
// It is possible that the whole
// string is palindrome.
// Case 1: Length is even and
// whole string is palindrome
if (j - i == 1) {
return pre + suff;
}
// Case 2: Length is odd and
// whole string is palindrome
if (j - i == 2) {
// Adding that mid character
string mid_char = S.substr(i + 1, 1);
return pre + mid_char + suff;
}
// Add prefix or suffix of the remaining
// string or suffix, whichever is longer
string rem_str
= S.substr(i + 1, j - i - 1);
string pre_of_rem_str
= palindromePrefix(rem_str);
// Reverse the remaining string to
// find the palindromic suffix
reverse(rem_str.begin(), rem_str.end());
string suff_of_rem_str
= palindromePrefix(rem_str);
if (pre_of_rem_str.size()
>= suff_of_rem_str.size()) {
return pre + pre_of_rem_str + suff;
}
else {
return pre + suff_of_rem_str + suff;
}
}
// Driver Code
int main()
{
string S = "geeksforskeeg";
cout << maxPalindrome(S);
return 0;
}
Java
// Java program of the
// above approach
import java.util.*;
class GFG{
// Function to find palindromic
// prefix of maximum length
static String palindromePrefix(String S)
{
int n = S.length();
// Finding palindromic prefix of
// maximum length
for(int i = n - 1; i >= 0; i--)
{
String curr = S.substring(0, i + 1);
// Checking if curr subString
// is palindrome or not.
int l = 0, r = curr.length() - 1;
boolean is_palindrome = true;
while (l < r)
{
if (curr.charAt(l) != curr.charAt(r))
{
is_palindrome = false;
break;
}
l++;
r--;
}
// Condition to check if the
// prefix is a palindrome
if (is_palindrome)
return curr;
}
// If no palindrome exist
return "";
}
// Function to find the maximum size
// palindrome such that after removing
// minimum size subString
static String maxPalindrome(String S)
{
int n = S.length();
if (n <= 1)
{
return S;
}
String pre = "", suff = "";
// Finding prefix and suffix
// of same length
int i = 0, j = n - 1;
while (S.charAt(i) ==
S.charAt(j) && i < j)
{
i++;
j--;
}
// Matching the ranges
i--;
j++;
pre = S.substring(0, i + 1);
suff = S.substring(j);
// It is possible that the whole
// String is palindrome.
// Case 1: Length is even and
// whole String is palindrome
if (j - i == 1)
{
return pre + suff;
}
// Case 2: Length is odd and
// whole String is palindrome
if (j - i == 2)
{
// Adding that mid character
String mid_char = S.substring(i + 1,
i + 2);
return pre + mid_char + suff;
}
// Add prefix or suffix of the remaining
// String or suffix, whichever is longer
String rem_str = S.substring(i + 1, j);
String pre_of_rem_str = palindromePrefix(rem_str);
// Reverse the remaining String to
// find the palindromic suffix
rem_str = reverse(rem_str);
String suff_of_rem_str = palindromePrefix(rem_str);
if (pre_of_rem_str.length() >=
suff_of_rem_str.length())
{
return pre + pre_of_rem_str + suff;
}
else
{
return pre + suff_of_rem_str + suff;
}
}
static String reverse(String input)
{
char[] a = input.toCharArray();
int l, r = a.length - 1;
for(l = 0; l < r; l++, r--)
{
char temp = a[l];
a[l] = a[r];
a[r] = temp;
}
return String.valueOf(a);
}
// Driver Code
public static void main(String[] args)
{
String S = "geeksforskeeg";
System.out.print(maxPalindrome(S));
}
}
// This code is contributed by Amit Katiyar
Python3
# Python3 program of the
# above approach
# Function to find palindromic
# prefix of maximum length
def palindromePrefix(S):
n = len(S)
# Finding palindromic prefix
# of maximum length
for i in range(n - 1, -1, -1):
curr = S[0 : i + 1]
# Checking if curr substring
# is palindrome or not.
l = 0
r = len(curr) - 1
is_palindrome = 1
while (l < r):
if (curr[l] != curr[r]):
is_palindrome = 0
break
l += 1
r -= 1
# Condition to check if the
# prefix is a palindrome
if (is_palindrome):
return curr
# if no palindrome exist
return ""
# Function to find the maximum
# size palindrome such that
# after removing minimum size
# substring
def maxPalindrome(S):
n = len(S)
if (n <= 1):
return S
pre = ""
suff = ""
# Finding prefix and
# suffix of same length
i = 0
j = n - 1
while (S[i] == S[j] and
i < j):
i += 1
j -= 1
# Matching the ranges
i -= 1
j += 1
pre = S[0 : i + 1]
suff = S[j:]
# It is possible that the
# whole string is palindrome.
# Case 1: Length is even and
# whole string is palindrome
if (j - i == 1):
return pre + suff
# Case 2: Length is odd and
# whole string is palindrome
if (j - i == 2):
# Adding that mid character
mid_char = S[i + 1 : i + 2]
return pre + mid_char + suff
# Add prefix or suffix of the
# remaining string or suffix,
# whichever is longer
rem_str = S[i + 1 : j]
pre_of_rem_str = palindromePrefix(rem_str)
# Reverse the remaining string to
# find the palindromic suffix
list1 = list(rem_str)
list1.reverse()
rem_str = ''.join(list1)
suff_of_rem_str = palindromePrefix(rem_str)
if (len(pre_of_rem_str) >=
len(suff_of_rem_str)):
return (pre + pre_of_rem_str +
suff)
else:
return (pre + suff_of_rem_str +
suff)
# Driver Code
if __name__ == "__main__":
S = "geeksforskeeg"
print(maxPalindrome(S))
# This code is contributed by Chitranayal
C#
// C# program of the
// above approach
using System;
class GFG{
// Function to find palindromic
// prefix of maximum length
static String palindromePrefix(String S)
{
int n = S.Length;
// Finding palindromic prefix of
// maximum length
for(int i = n - 1; i >= 0; i--)
{
String curr = S.Substring(0, i + 1);
// Checking if curr subString
// is palindrome or not.
int l = 0, r = curr.Length - 1;
bool is_palindrome = true;
while (l < r)
{
if (curr[l] != curr[r])
{
is_palindrome = false;
break;
}
l++;
r--;
}
// Condition to check if the
// prefix is a palindrome
if (is_palindrome)
return curr;
}
// If no palindrome exist
return "";
}
// Function to find the maximum size
// palindrome such that after removing
// minimum size subString
static String maxPalindrome(String S)
{
int n = S.Length;
if (n <= 1)
{
return S;
}
String pre = "", suff = "";
// Finding prefix and suffix
// of same length
int i = 0, j = n - 1;
while (S[i] == S[j] && i < j)
{
i++;
j--;
}
// Matching the ranges
i--;
j++;
pre = S.Substring(0, i + 1);
suff = S.Substring(j);
// It is possible that the whole
// String is palindrome.
// Case 1: Length is even and
// whole String is palindrome
if (j - i == 1)
{
return pre + suff;
}
// Case 2: Length is odd and
// whole String is palindrome
if (j - i == 2)
{
// Adding that mid character
String mid_char = S.Substring(i + 1,
i + 2);
return pre + mid_char + suff;
}
// Add prefix or suffix of the remaining
// String or suffix, whichever is longer
String rem_str = S.Substring(i + 1, j);
String pre_of_rem_str = palindromePrefix(rem_str);
// Reverse the remaining String to
// find the palindromic suffix
rem_str = reverse(rem_str);
String suff_of_rem_str = palindromePrefix(rem_str);
if (pre_of_rem_str.Length >=
suff_of_rem_str.Length)
{
return pre + pre_of_rem_str + suff;
}
else
{
return pre + suff_of_rem_str + suff;
}
}
static String reverse(String input)
{
char[] a = input.ToCharArray();
int l, r = a.Length - 1;
for(l = 0; l < r; l++, r--)
{
char temp = a[l];
a[l] = a[r];
a[r] = temp;
}
return String.Join("", a);
}
// Driver Code
public static void Main(String[] args)
{
String S = "geeksforskeeg";
Console.Write(maxPalindrome(S));
}
}
// This code is contributed by shikhasingrajput
Javascript
输出:
geeksfskeeg
时间复杂度: O(N 2 )
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。