博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 516. 最长回文子序列
阅读量:4115 次
发布时间:2019-05-25

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

给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。

示例 1:

输入:"bbbab"输出:4一个可能的最长回文子序列为 "bbbb"。

示例 2:

输入:"cbbd"输出:2一个可能的最长回文子序列为 "bb"。

思路:

定义dp[i][j]:表示s[i...j]之间的最长子序列的长度,注意是子序列,不是子串,子序列是可以跳跃的,子串不可以

s[i]==s[j]时,说明ij位置的字符可以形成一个回文,这个回文的长度为2,根据dp的思想,其结果应该是依赖前面的结果,也就是s[i+1 .... j-1]这个范围的字符回文个数,也就是dp[i+1][j-1],即dp[i][j]=dp[i+1][j-1]+2dp[i][j]=dp[i+1][j−1]+2
s[i]!=s[j]时,说明i与j位置的字符不能形成一个回文,这个时候要看s[i+1...j]s[i+1...j]s[i...j-1]s[i...j−1]这两段,因为s[i+1]s[i+1]可能与s[i+2...j]s[i+2...j]范围内的某个字符相同,拼凑出回文,因为s[i]!=s[j]s[i]!=s[j],同理可得s[i...j-1]s[i...j−1]这段,故此,dp[i][j]=max[dp[i][j-1],dp[i+1][j]]dp[i][j]=max[dp[i][j−1],dp[i+1][j]]

base case:

很容想到的是i==j时,说明s[i...j]只有一个字符,此时其自身可以形成一个回文,长度为1
i>j时,此时是不存在的,因为我们规定了s[i...j]起始位置i要小于结束位置j的,此时初始化为0

代码:

class Solution {
public int longestPalindromeSubseq(String s) {
int n = s.length(); int[][] dp = new int[n][n]; for(int i=0; i
=0; i--){
for(int j=i+1; j

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

你可能感兴趣的文章
【JAVA数据结构】先进先出队列
查看>>
乘法逆元
查看>>
Objective-C 基础入门(一)
查看>>
Flutter Boost的router管理
查看>>
iOS开发支付集成之微信支付
查看>>
C++模板
查看>>
【C#】如何实现一个迭代器
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
DirectX11 光照演示示例Demo
查看>>
VUe+webpack构建单页router应用(一)
查看>>
Node.js-模块和包
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
PHP 7 的五大新特性
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>
XHProf-php轻量级的性能分析工具
查看>>
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
OpenCV meanshift目标跟踪总结
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>