计算给定字符串中的所有回文子序列

找出给定字符串中可以形成多少回文子序列(不一定是不同的)。请注意,空字符串不被视为回文。 例如:

null
Input : str = "abcd"Output : 4Explanation :- palindromic  subsequence are : "a" ,"b", "c" ,"d" Input : str = "aab"Output : 4Explanation :- palindromic subsequence are :"a", "a", "b", "aa"Input : str = "aaaa"Output : 15

上述问题可以递归定义。

Initial Values : i= 0, j= n-1;CountPS(i,j)// Every single character of a string is a palindrome // subsequence if i == j   return 1 // palindrome of length 1// If first and last characters are same, then we // consider it as palindrome subsequence and check// for the rest subsequence (i+1, j), (i, j-1)Else if (str[i] == str[j)]   return   countPS(i+1, j) + countPS(i, j-1) + 1;else   // check for rest sub-sequence and  remove common   // palindromic subsequences as they are counted   // twice when we do countPS(i+1, j) + countPS(i,j-1)   return countPS(i+1, j) + countPS(i, j-1) - countPS(i+1, j-1)

Explanation of Recurisive Solution to Counting Palindromic Subsequence

如果我们画出上述递归解的递归树,我们可以观察到 重叠子问题 由于这个问题有重叠的子问题,我们可以使用动态规划有效地解决它。下面是基于动态规划的解决方案。

C++

// Counts Palindromic Subsequence in a given String
#include <cstring>
#include <iostream>
using namespace std;
// Function return the total palindromic subsequence
int countPS(string str)
{
int N = str.length();
// create a 2D array to store the count of palindromic
// subsequence
int cps[N + 1][N + 1];
memset (cps, 0, sizeof (cps));
// palindromic subsequence of length 1
for ( int i = 0; i < N; i++)
cps[i][i] = 1;
// check subsequence of length L is palindrome or not
for ( int L = 2; L <= N; L++) {
for ( int i = 0; i <= N-L; i++) {
int k = L + i - 1;
if (str[i] == str[k])
cps[i][k]
= cps[i][k - 1] + cps[i + 1][k] + 1;
else
cps[i][k] = cps[i][k - 1] + cps[i + 1][k]
- cps[i + 1][k - 1];
}
}
// return total palindromic subsequence
return cps[0][N - 1];
}
// Driver program
int main()
{
string str = "abcb" ;
cout << "Total palindromic subsequence are : "
<< countPS(str) << endl;
return 0;
}


JAVA

// Java code to Count Palindromic Subsequence
// in a given String
public class GFG {
// Function return the total palindromic
// subsequence
static int countPS(String str)
{
int N = str.length();
// create a 2D array to store the count
// of palindromic subsequence
int [][] cps = new int [N][N];
// palindromic subsequence of length 1
for ( int i = 0 ; i < N; i++)
cps[i][i] = 1 ;
// check subsequence of length L is
// palindrome or not
for ( int L = 2 ; L <= N; L++) {
for ( int i = 0 ; i <= N-L; i++) {
int k = L + i - 1 ;
if (str.charAt(i) == str.charAt(k)) {
cps[i][k] = cps[i][k - 1 ]
+ cps[i + 1 ][k] + 1 ;
} else {
cps[i][k] = cps[i][k - 1 ]
+ cps[i + 1 ][k]
- cps[i + 1 ][k - 1 ];
}
}
}
// return total palindromic subsequence
return cps[ 0 ][N - 1 ];
}
// Driver program
public static void main(String args[])
{
String str = "abcb" ;
System.out.println( "Total palindromic "
+ "subsequence are : "
+ countPS(str));
}
}
// This code is contributed by Sumit Ghosh


Python3

# Python3 code to Count Palindromic
# Subsequence in a given String
# Function return the total
# palindromic subsequence
def countPS( str ):
N = len ( str )
# Create a 2D array to store the count
# of palindromic subsequence
cps = [[ 0 for i in range (N + 2 )] for j in range (N + 2 )]
# palindromic subsequence of length 1
for i in range (N):
cps[i][i] = 1
# check subsequence of length L
# is palindrome or not
for L in range ( 2 , N + 1 ):
for i in range (N):
k = L + i - 1
if (k < N):
if ( str [i] = = str [k]):
cps[i][k] = (cps[i][k - 1 ] +
cps[i + 1 ][k] + 1 )
else :
cps[i][k] = (cps[i][k - 1 ] +
cps[i + 1 ][k] -
cps[i + 1 ][k - 1 ])
# return total palindromic subsequence
return cps[ 0 ][N - 1 ]
# Driver program
str = "abcb"
print ( "Total palindromic subsequence are : " , countPS( str ))
# This code is contributed by Anant Agarwal.


C#

// C# code to Count Palindromic Subsequence
// Subsequence in a given String
using System;
class GFG {
// Function return the total
// palindromic subsequence
static int countPS( string str)
{
int N = str.Length;
// create a 2D array to store the
// count of palindromic subsequence
int [, ] cps = new int [N + 1, N + 1];
// palindromic subsequence
// of length 1
for ( int i = 0; i < N; i++)
cps[i, i] = 1;
// check subsequence of length
// L is palindrome or not
for ( int L = 2; L <= N; L++) {
for ( int i = 0; i <= N-L; i++) {
int k = L + i - 1;
if (k < N) {
if (str[i] == str[k])
cps[i, k] = cps[i, k - 1]
+ cps[i + 1, k] + 1;
else
cps[i, k] = cps[i, k - 1]
+ cps[i + 1, k]
- cps[i + 1, k - 1];
}
}
}
// return total palindromic
// subsequence
return cps[0, N - 1];
}
// Driver Code
public static void Main()
{
string str = "abcb" ;
Console.Write( "Total palindromic "
+ "subsequence are : "
+ countPS(str));
}
}
// This code is contributed by nitin mittal.


PHP

<?php
// Counts Palindromic Subsequence in
// a given String
// Function return the total
// palindromic subsequence
function countPS( $str )
{
$N = strlen ( $str );
// create a 2D array to store the
// count of palindromic subsequence
$cps = array_fill (0, $N + 1,
array_fill (0, $N + 1, NULL));
// palindromic subsequence of length 1
for ( $i = 0; $i < $N ; $i ++)
$cps [ $i ][ $i ] = 1;
// check subsequence of length L
// is palindrome or not
for ( $L = 2; $L <= $N ; $L ++)
{
for ( $i = 0; $i <= $N - $L ; $i ++)
{
$k = $L + $i - 1;
if ( $str [ $i ] == $str [ $k ])
$cps [ $i ][ $k ] = $cps [ $i ][ $k - 1] +
$cps [ $i + 1][ $k ] + 1;
else
$cps [ $i ][ $k ] = $cps [ $i ][ $k - 1] +
$cps [ $i + 1][ $k ] -
$cps [ $i + 1][ $k - 1];
}
}
// return total palindromic subsequence
return $cps [0][ $N - 1];
}
// Driver Code
$str = "abcb" ;
echo "Total palindromic subsequence are : " .
countPS( $str ) . "" ;
// This code is contributed by ita_c
?>


Javascript

<script>
// Javascript code to Count Palindromic Subsequence
// in a given String
// Function return the total palindromic
// subsequence
function countPS(str)
{
let N = str.length;
// create a 2D array to store the count
// of palindromic subsequence
let cps = new Array(N);
for (let i=0;i<N;i++)
{
cps[i]= new Array(N);
for (let j=0;j<N;j++)
{
cps[i][j]=0;
}
}
// palindromic subsequence of length 1
for (let i = 0; i < N; i++)
cps[i][i] = 1;
// check subsequence of length L is
// palindrome or not
for (let L = 2; L <= N; L++) {
for (let i = 0; i <= N-L; i++) {
let k = L + i - 1;
if (str[i] == str[k]) {
cps[i][k] = cps[i][k - 1]
+ cps[i + 1][k] + 1;
} else {
cps[i][k] = cps[i][k - 1]
+ cps[i + 1][k]
- cps[i + 1][k - 1];
}
}
}
// return total palindromic subsequence
return cps[0][N - 1];
}
// Driver program
let str = "abcb" ;
document.write( "Total palindromic "
+ "subsequence are : "
+ countPS(str));
// This code is contributed by avanitrachhadiya2155
</script>


输出:

Total palindromic subsequence are : 6

时间复杂性: O(N) 2. )

另一种方法: (使用递归)

C++

// C++ program to counts Palindromic Subsequence
// in a given String using recursion
#include <bits/stdc++.h>
using namespace std;
int n, dp[1000][1000];
string str = "abcb" ;
// Function return the total
// palindromic subsequence
int countPS( int i, int j)
{
if (i > j)
return 0;
if (dp[i][j] != -1)
return dp[i][j];
if (i == j)
return dp[i][j] = 1;
else if (str[i] == str[j])
return dp[i][j]
= countPS(i + 1, j) +
countPS(i, j - 1) + 1;
else
return dp[i][j] = countPS(i + 1, j) +
countPS(i, j - 1) -
countPS(i + 1, j - 1);
}
// Driver code
int main()
{
memset (dp, -1, sizeof (dp));
n = str.size();
cout << "Total palindromic subsequence are : "
<< countPS(0, n - 1) << endl;
return 0;
}
// this code is contributed by Kushdeep Mittal


JAVA

// Java program to counts Palindromic Subsequence
// in a given String using recursion
class GFG {
static int n;
static int [][] dp = new int [ 1000 ][ 1000 ];
static String str = "abcb" ;
// Function return the total
// palindromic subsequence
static int countPS( int i, int j)
{
if (i > j)
return 0 ;
if (dp[i][j] != - 1 )
return dp[i][j];
if (i == j)
return dp[i][j] = 1 ;
else if (str.charAt(i) == str.charAt(j))
return dp[i][j]
= countPS(i + 1 , j) +
countPS(i, j - 1 ) + 1 ;
else
return dp[i][j] = countPS(i + 1 , j) +
countPS(i, j - 1 ) -
countPS(i + 1 , j - 1 );
}
// Driver code
public static void main(String[] args)
{
for ( int i = 0 ; i < 1000 ; i++)
for ( int j = 0 ; j < 1000 ; j++)
dp[i][j] = - 1 ;
n = str.length();
System.out.println( "Total palindromic subsequence"
+ "are : " + countPS( 0 , n - 1 ));
}
}
// This code is contributed by Ryuga


Python 3

# Python 3 program to counts Palindromic
# Subsequence in a given String using recursion
str = "abcb"
# Function return the total
# palindromic subsequence
def countPS(i, j):
if (i > j):
return 0
if (dp[i][j] ! = - 1 ):
return dp[i][j]
if (i = = j):
dp[i][j] = 1
return dp[i][j]
else if ( str [i] = = str [j]):
dp[i][j] = (countPS(i + 1 , j) +
countPS(i, j - 1 ) + 1 )
return dp[i][j]
else :
dp[i][j] = (countPS(i + 1 , j) +
countPS(i, j - 1 ) -
countPS(i + 1 , j - 1 ))
return dp[i][j]
# Driver code
if __name__ = = "__main__" :
dp = [[ - 1 for x in range ( 1000 )]
for y in range ( 1000 )]
n = len ( str )
print ( "Total palindromic subsequence are :" ,
countPS( 0 , n - 1 ))
# This code is contributed by ita_c


C#

// C# program to counts Palindromic Subsequence
// in a given String using recursion
using System;
class GFG {
static int n;
static int [, ] dp = new int [1000, 1000];
static string str = "abcb" ;
// Function return the total
// palindromic subsequence
static int countPS( int i, int j)
{
if (i > j)
return 0;
if (dp[i, j] != -1)
return dp[i, j];
if (i == j)
return dp[i, j] = 1;
else if (str[i] == str[j])
return dp[i, j]
= countPS(i + 1, j) +
countPS(i, j - 1) + 1;
else
return dp[i, j] = countPS(i + 1, j)
+ countPS(i, j - 1)
- countPS(i + 1, j - 1);
}
// Driver code
static void Main()
{
for ( int i = 0; i < 1000; i++)
for ( int j = 0; j < 1000; j++)
dp[i, j] = -1;
n = str.Length;
Console.Write( "Total palindromic subsequence"
+ "are : " + countPS(0, n - 1));
}
}
// This code is contributed by DrRoot_


PHP

<?php
// PHP program to counts Palindromic Subsequence
// in a given String using recursion
$dp = array_fill (0, 100,
array_fill (0, 1000, -1));
$str = "abcb" ;
$n = strlen ( $str );
// Function return the total
// palindromic subsequence
function countPS( $i , $j )
{
global $str , $dp , $n ;
if ( $i > $j )
return 0;
if ( $dp [ $i ][ $j ] != -1)
return $dp [ $i ][ $j ];
if ( $i == $j )
return $dp [ $i ][ $j ] = 1;
else if ( $str [ $i ] == $str [ $j ])
return $dp [ $i ][ $j ] = countPS( $i + 1, $j ) +
countPS( $i , $j - 1) + 1;
else
return $dp [ $i ][ $j ] = countPS( $i + 1, $j ) +
countPS( $i , $j - 1) -
countPS( $i + 1, $j - 1);
}
// Driver code
echo "Total palindromic subsequence are : " .
countPS(0, $n - 1);
// This code is contributed by mits
?>


Javascript

<script>
// Javascript program to counts Palindromic Subsequence
// in a given String using recursion
let n;
let dp= new Array(1000);
for (let i=0;i<1000;i++)
{
dp[i]= new Array(1000);
for (let j=0;j<1000;j++)
{
dp[i][j]=-1;
}
}
let str = "abcb" ;
// Function return the total
// palindromic subsequence
function countPS(i,j)
{
if (i > j)
return 0;
if (dp[i][j] != -1)
return dp[i][j];
if (i == j)
return dp[i][j] = 1;
else if (str[i] == str[j])
return dp[i][j]
= countPS(i + 1, j) +
countPS(i, j - 1) + 1;
else
return dp[i][j] = countPS(i + 1, j) +
countPS(i, j - 1) -
countPS(i + 1, j - 1);
}
// Driver code
n = str.length;
document.write( "Total palindromic subsequence"
+ "are : " + countPS(0, n - 1));
// This code is contributed by rag2127
</script>


输出:

Total palindromic subsequence are : 6

本文由 西山东星(品图) .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享