给定一个字符串S,该字符串的各项指标任务是找到最长回文串的长度是该指数在任开始或结束。
例子:
Input: S = “bababa”
Output: 5 5 3 3 5 5
Explanation:
Longest palindromic substring starting at index 0 is “babab”. Therefore, length = 5
Longest palindromic substring starting at index 1 is “ababa”. Therefore, length = 5
Longest palindromic substring ending at index 2 is “bab”. Therefore, length = 3
Longest palindromic substring ending at index 3 is “aba”. Therefore, length = 3
Longest palindromic substring ending at index 4 is “babab”. Therefore, length = 5
Longest palindromic substring ending at index 5 is “ababa”. Therefore, length = 5
Input: S = “aaa”
Output: 3 2 3
Explanation:
Longest palindromic substring starting at index 0 is “aaa”. Therefore, length = 3
Longest palindromic substring starting at index 1 is “ab”. Therefore, length = 2
Longest palindromic substring ending at index 3 is: “aaa”. Therefore, length = 3
方法:解决这个问题的想法是遍历字符串,对于每个索引,检查可以用该索引形成的最长回文子串作为回文子串的起始索引和结束索引。请按照以下步骤解决问题:
- 初始化一个数组palLength[]来存储每个索引的最长回文子串的长度。
- 使用变量i遍历字符串并执行以下操作:
- 初始化一个变量,比如maxLength ,以存储每个索引的最长回文子串的长度。
- 将i视为回文子串的结束索引,并在[0, i – 1]范围内从j 中找到第一个索引,使得S[j, i] 是一个回文。更新maxLength 。
- 将 i 视为回文子串的起始索引,并在[N – 1, i + 1]范围内从j 中找到最后一个索引,使得S[i, j] 是一个回文。更新maxLength 。
- 将maxLength的值存储在palLength[i] 中得到的最大长度。
- 完成以上步骤后,打印出数组palLength[]作为结果。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to return true if
// S[i...j] is a palindrome
bool isPalindrome(string S, int i, int j)
{
// Iterate until i < j
while (i < j)
{
// If unequal character encountered
if (S[i] != S[j])
return false;
i++;
j--;
}
// Otherwise
return true;
}
// Function to find for every index,
// longest palindromic substrings
// starting or ending at that index
void printLongestPalindrome(string S, int N)
{
// Stores the maximum palindromic
// substring length for each index
int palLength[N];
// Traverse the string
for (int i = 0; i < N; i++)
{
// Stores the maximum length
// of palindromic substring
int maxlength = 1;
// Consider that palindromic
// substring ends at index i
for (int j = 0; j < i; j++)
{
// If current character is
// a valid starting index
if (S[j] == S[i])
{
// If S[i, j] is palindrome,
if (isPalindrome(S, j, i))
{
// Update the length of
// the longest palindrome
maxlength = i - j + 1;
break;
}
}
}
// Consider that palindromic
// substring starts at index i
for (int j = N - 1; j > i; j--)
{
// If current character is
// a valid ending index
if (S[j] == S[i])
{
// If str[i, j] is palindrome
if (isPalindrome(S, i, j))
{
// Update the length of
// the longest palindrome
maxlength = max(j - i + 1, maxlength);
break;
}
}
}
// Update length of the longest
// palindromic substring for index i
palLength[i] = maxlength;
}
// Print the length of the
// longest palindromic substring
for (int i = 0; i < N; i++)
{
cout << palLength[i] << " ";
}
}
// Driver Code
int main()
{
string S = "bababa";
int N = S.length();
printLongestPalindrome(S, N);
return 0;
}
// This code is contributed by Kingash.
Java
// Java program for the above approach
class GFG {
// Function to find for every index,
// longest palindromic substrings
// starting or ending at that index
public static void
printLongestPalindrome(String S,
int N)
{
// Stores the maximum palindromic
// substring length for each index
int palLength[] = new int[N];
// Traverse the string
for (int i = 0; i < N; i++) {
// Stores the maximum length
// of palindromic substring
int maxlength = 1;
// Consider that palindromic
// substring ends at index i
for (int j = 0; j < i; j++) {
// If current character is
// a valid starting index
if (S.charAt(j) == S.charAt(i)) {
// If S[i, j] is palindrome,
if (isPalindrome(S, j, i)) {
// Update the length of
// the longest palindrome
maxlength = i - j + 1;
break;
}
}
}
// Consider that palindromic
// substring starts at index i
for (int j = N - 1; j > i; j--) {
// If current character is
// a valid ending index
if (S.charAt(j) == S.charAt(i)) {
// If str[i, j] is palindrome
if (isPalindrome(S, i, j)) {
// Update the length of
// the longest palindrome
maxlength = Math.max(j - i + 1,
maxlength);
break;
}
}
}
// Update length of the longest
// palindromic substring for index i
palLength[i] = maxlength;
}
// Print the length of the
// longest palindromic substring
for (int i = 0; i < N; i++) {
System.out.print(palLength[i] + " ");
}
}
// Function to return true if
// S[i...j] is a palindrome
public static boolean isPalindrome(
String S, int i, int j)
{
// Iterate until i < j
while (i < j) {
// If unequal character encountered
if (S.charAt(i) != S.charAt(j))
return false;
i++;
j--;
}
// Otherwise
return true;
}
// Driver Code
public static void main(String[] args)
{
String S = "bababa";
int N = S.length();
printLongestPalindrome(S, N);
}
}
Python3
# Python program for the above approach
# Function to return true if
# S[i...j] is a palindrome
def isPalindrome(S, i, j):
# Iterate until i < j
while (i < j):
# If unequal character encountered
if (S[i] != S[j]):
return False
i += 1
j -= 1
# Otherwise
return True
# Function to find for every index,
# longest palindromic substrings
# starting or ending at that index
def printLongestPalindrome(S, N):
# Stores the maximum palindromic
# substring length for each index
palLength = [0 for i in range(N)]
# Traverse the string
for i in range(N):
# Stores the maximum length
# of palindromic substring
maxlength = 1
# Consider that palindromic
# substring ends at index i
for j in range(i):
# If current character is
# a valid starting index
if (S[j] == S[i]):
# If S[i, j] is palindrome,
if (isPalindrome(S, j, i)):
# Update the length of
# the longest palindrome
maxlength = i - j + 1
break
# Consider that palindromic
# substring starts at index i
j = N-1
while(j > i):
# If current character is
# a valid ending index
if (S[j] == S[i]):
# If str[i, j] is palindrome
if (isPalindrome(S, i, j)):
# Update the length of
# the longest palindrome
maxlength = max(j - i + 1, maxlength)
break
j -= 1
# Update length of the longest
# palindromic substring for index i
palLength[i] = maxlength
# Print the length of the
# longest palindromic substring
for i in range(N):
print(palLength[i],end = " ")
# Driver Code
if __name__ == '__main__':
S = "bababa"
N = len(S)
printLongestPalindrome(S, N)
# This code is contributed by SURENDRA_GANGWAR.
C#
// C# program for the above approach
using System;
class GFG
{
// Function to return true if
// S[i...j] is a palindrome
static bool isPalindrome(string S, int i, int j)
{
// Iterate until i < j
while (i < j)
{
// If unequal character encountered
if (S[i] != S[j])
return false;
i++;
j--;
}
// Otherwise
return true;
}
// Function to find for every index,
// longest palindromic substrings
// starting or ending at that index
static void printLongestPalindrome(string S, int N)
{
// Stores the maximum palindromic
// substring length for each index
int[] palLength = new int[N];
// Traverse the string
for (int i = 0; i < N; i++)
{
// Stores the maximum length
// of palindromic substring
int maxlength = 1;
// Consider that palindromic
// substring ends at index i
for (int j = 0; j < i; j++)
{
// If current character is
// a valid starting index
if (S[j] == S[i])
{
// If S[i, j] is palindrome,
if ((isPalindrome(S, j, i)) != false)
{
// Update the length of
// the longest palindrome
maxlength = i - j + 1;
break;
}
}
}
// Consider that palindromic
// substring starts at index i
for (int j = N - 1; j > i; j--)
{
// If current character is
// a valid ending index
if (S[j] == S[i])
{
// If str[i, j] is palindrome
if (isPalindrome(S, i, j))
{
// Update the length of
// the longest palindrome
maxlength = Math.Max(j - i + 1, maxlength);
break;
}
}
}
// Update length of the longest
// palindromic substring for index i
palLength[i] = maxlength;
}
// Print the length of the
// longest palindromic substring
for (int i = 0; i < N; i++)
{
Console.Write(palLength[i] + " ");
}
}
// Driver Code
static public void Main ()
{
string S = "bababa";
int N = S.Length;
printLongestPalindrome(S, N);
}
}
// This code is contributed by code_hunt.
Javascript
5 5 3 3 5 5
时间复杂度: O(N 3 )
辅助空间: O(1)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live