博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算在已知字符串中所有回文子序列的数目
阅读量:4098 次
发布时间:2019-05-25

本文共 1102 字,大约阅读时间需要 3 分钟。

原文地址:

在已知的字符串中查找有多少个回文的子序列(没必要对相同的做区分)。注意空字符串不能看作是回文。

例子:

输入 : str = "abcd"输出 : 4解释 :- 回文子序列有 : "a" ,"b", "c" ,"d" 输入 : str = "aab"输出 : 4解释 :- 回文子序列有 :"a", "a", "b", "aa"输入 : str = "aaaa"输出 : 15

以上问题可以做递归定义。

初始化 : i= 0, j= n-1;CountPS(i,j)// 一个字符串中每个单一的字符都是回文的子序列if i == j   return 1 // 回文的长度是1// 如果首位字符相同, 那么我们就认为它是一个回文子序列, 并检查剩下的序列(i+1, j), (i, j-1)Else if (str[i] == str[j)]   return   countPS(i+1, j) + countPS(i, j-1) + 1;else   // 当计算countPS(i+1, j) + countPS(i,j-1)的时候,检查剩下的子序列并移除一般的回文子序列因为它们计算了两次   return countPS(i+1, j) + countPS(i, j-1) - countPS(i+1, j-1)

如果我们画一下以上递归方法的递归树,我们可以看到有重复的子问题。因为问题有重复子问题,那么我们就可以用动态规划来解决它。下面是基于动态规划的实现:

// Counts Palindromic Subsequence in a given String#include
#include
using namespace std;// Function return the total palindromic subsequenceint 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

输出:

Total palindromic subsequence are : 6

时间复杂度:O( N2 )

转载地址:http://ezhii.baihongyu.com/

你可能感兴趣的文章
zookeeper(3)---zookeeper API的简单使用(增删改查操作)
查看>>
zookeeper(4)---监听器Watcher
查看>>
mapReduce(3)---入门示例WordCount
查看>>
hbase(3)---shell操作
查看>>
hbase(1)---概述
查看>>
hbase(5)---API示例
查看>>
SSM-CRUD(1)---环境搭建
查看>>
SSM-CRUD(2)---查询
查看>>
SSM-CRUD (3)---查询功能改造
查看>>
Nginx(2)---安装与启动
查看>>
springBoot(5)---整合servlet、Filter、Listener
查看>>
C++ 模板类型参数
查看>>
C++ 非类型模版参数
查看>>
设计模式 依赖倒转原则 & 里氏代换原则
查看>>
DirectX11 光照
查看>>
图形学 图形渲染管线
查看>>
DirectX11 计时和动画
查看>>
DirectX11 光照与材质的相互作用
查看>>
DirectX11 环境光
查看>>
DirectX11 镜面光
查看>>