给定一个字符串str ,任务是寻找偶数长度的最长回文子序列的长度,除了中间的字符外没有两个相邻的字符相同。
例子:
Input: str = “abscrcdba”
Output: 6
Explanation:
abccba is the required string which has no two consecutive characters same except the middle characters. Hence the length is 6
Input: str = “abcd”
Output: 1
方法:想法是形成一个递归解决方案,并使用动态编程存储子问题的值。可以按照以下步骤计算结果:
- 形成一个递归函数,它将采用一个字符串和一个字符作为子序列的起始字符。
- 如果字符串的第一个和最后一个字符与给定字符匹配,则删除第一个和最后一个字符,并使用除给定字符之外的所有字符值从’a’到’z’调用函数,因为相邻字符不能相同并找到最大长度。
- 如果字符串的第一个和最后一个字符不给定的字符匹配,然后找到字符串中的给定字符的第一个和最后一个指标,说我分别学家将子字符串从i转移到j,并使用子字符串和给定字符调用函数。
- 最后,将值存储在无序映射中,如果再次使用相同的参数调用该函数,请使用该值。
以下是上述方法的实现:
C++
// C++ implementation of above approach
#include
using namespace std;
#define lli long long int
// To store the values of subproblems
unordered_map dp;
// Function to find the
// Longest Palindromic subsequence of even
// length with no two adjacent characters same
lli solve(string s, char c)
{
// Base cases
// If the string length is 1 return 0
if (s.length() == 1)
return 0;
// If the string length is 2
if (s.length() == 2) {
// Check if the characters match
if (s[0] == s[1] && s[0] == c)
return 1;
else
return 0;
}
// If the value with given parameters is
// previously calculated
if (dp[s + " " + c])
return dp[s + " " + c];
lli ans = 0;
// If the first and last character of the
// string matches with the given character
if (s[0] == s[s.length() - 1] && s[0] == c)
{
// Remove the first and last character
// and call the function for all characters
for (char c1 = 'a'; c1 <= 'z'; c1++)
if (c1 != c)
ans = max(
ans,
1 + solve(s.substr(1,
s.length() - 2),
c1));
}
// If it does not match
else {
// Then find the first and last index of
// given character in the given string
for (lli i = 0; i < s.length(); i++)
{
if (s[i] == c)
{
for (lli j = s.length() - 1; j > i; j--)
if (s[j] == c)
{
if (j == i)
break;
// Take the substring from i
// to j and call the function
// with substring
// and the given character
ans = solve(s.substr(i, j - i + 1),
c);
break;
}
break;
}
}
}
// Store the answer for future use
dp[s + " " + c] = ans;
return dp[s + " " + c];
}
// Driver code
int main()
{
string s = "abscrcdba";
lli ma = 0;
// Check for all starting characters
for (char c1 = 'a'; c1 <= 'z'; c1++)
ma = max(ma, solve(s, c1) * 2);
cout << ma << endl;
return 0;
}
Java
// Java implementation of above approach
import java.util.*;
class GFG {
// To store the values of subproblems
static Map dp = new HashMap<>();
// Function to find the
// Longest Palindromic subsequence of even
// length with no two adjacent characters same
static Integer solve(char[] s, char c)
{
// Base cases
// If the String length is 1 return 0
if (s.length == 1)
return 0;
// If the String length is 2
if (s.length == 2) {
// Check if the characters match
if (s[0] == s[1] && s[0] == c)
return 1;
else
return 0;
}
// If the value with given parameters is
// previously calculated
if (dp.containsKey(String.valueOf(s) + " " + c))
return dp.get(String.valueOf(s) + " " + c);
Integer ans = 0;
// If the first and last character of the
// String matches with the given character
if (s[0] == s[s.length - 1] && s[0] == c)
{
// Remove the first and last character
// and call the function for all characters
for (char c1 = 'a'; c1 <= 'z'; c1++)
if (c1 != c)
ans = Math.max(
ans,
1 + solve(Arrays.copyOfRange(
s, 1,
s.length - 1),
c1));
}
// If it does not match
else {
// Then find the first and last index of
// given character in the given String
for (Integer i = 0; i < s.length; i++)
{
if (s[i] == c)
{
for (Integer j = s.length - 1;
j > i;
j--)
if (s[j] == c)
{
if (j == i)
break;
// Take the subString from i
// to j and call the function
// with subString
// and the given character
ans = solve(Arrays.copyOfRange(
s, i,
j + 1),
c);
break;
}
break;
}
}
}
// Store the answer for future use
dp.put(String.valueOf(s) + " " + c, ans);
return dp.get(String.valueOf(s) + " " + c);
}
// Driver code
public static void main(String[] args)
{
String s = "abscrcdba";
Integer ma = 0;
// Check for all starting characters
for (char c1 = 'a'; c1 <= 'z'; c1++)
ma = Math.max(ma,
solve(s.toCharArray(), c1) * 2);
System.out.print(ma + "\n");
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 implementation of above approach
# To store the values of subproblems
dp = {}
# Function to find the
# Longest Palindromic subsequence of even
# length with no two adjacent characters same
def solve(s, c):
# Base cases
# If the string length is 1 return 0
if (len(s) == 1):
return 0
# If the string length is 2
if (len(s) == 2):
# Check if the characters match
if (s[0] == s[1] and s[0] == c):
return 1
else:
return 0
# If the value with given parameters is
# previously calculated
if (s + " " + c) in dp:
return dp[s + " " + c]
ans = 0
# If the first and last character of the
# string matches with the given character
if (s[0] == s[len(s) - 1] and s[0] == c):
# Remove the first and last character
# and call the function for all characters
for c1 in range(97, 123):
if (chr(c1) != c):
ans = max(ans, 1 + solve(
s[1: len(s) - 1], chr(c1)))
# If it does not match
else:
# Then find the first and last index of
# given character in the given string
for i in range(len(s)):
if (s[i] == c):
for j in range(len(s) - 1, i, -1):
if (s[j] == c):
if (j == i):
break
# Take the substring from i
# to j and call the function
# with substring
# and the given character
ans = solve(s[i: j - i + 2], c)
break
break
# Store the answer for future use
dp[s + " " + c] = ans
return dp[s + " " + c]
# Driver code
if __name__ == "__main__":
s = "abscrcdba"
ma = 0
# Check for all starting characters
for c1 in range(97, 123):
ma = max(ma, solve(s, chr(c1)) * 2)
print(ma)
# This code is contributed by AnkitRai01
C#
// C# implementation of
// the above approach
using System;
using System.Collections;
using System.Collections.Generic;
class GFG {
// To store the values of subproblems
static Dictionary dp
= new Dictionary();
// Function to find the
// Longest Palindromic subsequence of even
// length with no two adjacent characters same
static int solve(char[] s, char c)
{
// Base cases
// If the String length is 1 return 0
if (s.Length == 1)
return 0;
// If the String length is 2
if (s.Length == 2) {
// Check if the characters match
if (s[0] == s[1] && s[0] == c)
return 1;
else
return 0;
}
// If the value with given parameters is
// previously calculated
if (dp.ContainsKey(new string(s) + " " + c))
return dp[new string(s) + " " + c];
int ans = 0;
// If the first and last character of the
// String matches with the given character
if (s[0] == s[s.Length - 1] && s[0] == c)
{
// Remove the first and last character
// and call the function for all characters
for (char c1 = 'a'; c1 <= 'z'; c1++)
if (c1 != c) {
int len = s.Length - 2;
char[] tmp = new char[len];
Array.Copy(s, 1, tmp, 0, len);
ans = Math.Max(ans, 1 + solve(tmp, c1));
}
}
// If it does not match
else {
// Then find the first and last index of
// given character in the given String
for (int i = 0; i < s.Length; i++)
{
if (s[i] == c)
{
for (int j = s.Length - 1; j > i; j--)
if (s[j] == c)
{
if (j == i)
break;
// Take the subString from i
// to j and call the function
// with subString and the
// given character
int len = j + 1 - i;
char[] tmp = new char[len];
Array.Copy(s, i, tmp, 0, len);
ans = solve(tmp, c);
break;
}
break;
}
}
}
// Store the answer for future use
dp[new string(s) + " " + c] = ans;
return dp[new string(s) + " " + c];
}
// Driver Code
public static void Main(string[] args)
{
string s = "abscrcdba";
int ma = 0;
// Check for all starting characters
for (char c1 = 'a'; c1 <= 'z'; c1++)
ma = Math.Max(ma,
solve(s.ToCharArray(), c1) * 2);
Console.Write(ma + "\n");
}
}
// This code is contributed by rutvik_56
输出
6
时间复杂度: O(N 2 )
辅助空间: O(N)
相关文章:最长回文子序列