找到字符串中的最长回文子串
Problem statement:
问题陈述:
Given a string you have to find out the length of the longest palindromic subsequence from the given string.
给定一个字符串,您必须从给定的字符串中找出最长回文子序列的长度。
Input:
T Test case
T no of input string will be given to you.
E.g.
3
bghaufaght
souabbuos
sahajkhahas
Constrain
1≤ length (string) ≤100
Output:
Print the length of the longest palindromic sub sequences from that string
Example
例
T=3
Input:
bghaufahgt
Output:
7 (ghafahg)
Input:
souabbuos
Output:
8 (soubbuos)
Input:
sahajkhahas
Output:
9 (sahajahas)
Explanation with example:
举例说明:
Let there is a string str.
让我们有一个字符串str 。
Now possible arrangements are:
现在可能的安排是:
Single middle characters like aba
像aba这样的单个中间字符
Paired middle characters like bb
配对的中间字符,如bb
Let, f(a,b) = length of palindromic substring from index a to index b.
令f(a,b)=从索引a到索引b的回文子串的长度 。
Considering the above three facts:
考虑以上三个事实:
If there is only one character then f(a,a) = 1
如果只有一个字符,则f(a,a)= 1
If there are two characters a and a+1 both are same then f(a,a+1) = 2 if both are not same then f(a,a+1) = 1.
如果两个字符a和a + 1都相同,则f(a,a + 1)= 2;如果两个字符不相同,则f(a,a + 1)= 1 。
If there is a substring starting from index a to index b then,
如果存在从索引a到索引b的子字符串,
- If str[a] and str[b] both are same then f(a,b) = f(a+1,b-1) + 2
- 如果str [a]和str [b]都相同,则f(a,b)= f(a + 1,b-1)+ 2
- If str[a] and str[b] both are not same then f(a,b)= max{ f(a+1,b) , f(a,b-1) }
- 如果str [a]和str [b]都不相同,则f(a,b)= max {f(a + 1,b),f(a,b-1)}
For, str = bghaufahgt
因为, str = bghaufahgt
C++ Implementation:
C ++实现:
#include <bits/stdc++.h>
using namespace std;
int length_of_palindrom(string str)
{
int len = str.length();
int arr[len][len];
memset(arr, 0, sizeof(arr));
for (int i = 0; i < len; i++) {
arr[i][i] = 1;
}
//for the paired middle character
for (int i = 0; i < len - 1; i++) {
if (str[i] == str[i + 1])
arr[i][i + 1] = 2;
else
arr[i][i + 1] = 1;
}
//length wise traversal
for (int l = 3; l <= len; l++) {
for (int i = 0; i <= len - l; i++) {
int j = i + l - 1;
if (str[i] == str[j])
arr[i][j] = arr[i + 1][j - 1] + 2;
else
arr[i][j] = max(arr[i + 1][j], arr[i][j - 1]);
}
}
return arr[0][len - 1];
}
int main()
{
int t;
cout << "Test Case : ";
cin >> t;
while (t--) {
cout << "Enter the string : ";
string str;
cin >> str;
cout << "Length of the palindrome: " << length_of_palindrom(str) << endl;
}
}
Output
输出量
Test Case : 3
Enter the string : bghaufahgt
Length of the palindrome: 7
Enter the string : souabbuos
Length of the palindrome: 8
Enter the string : sahajkhahas
Length of the palindrome: 9
找到字符串中的最长回文子串