动态规划:回文串系列
1、最长回文子串
寻找回文串的问题核心思想是:
从中间开始向两边扩散来判断回文串
for 0 <= i < len(s):找到以 s[i] 为中心的回文串;(奇数)找到以 s[i] 和 s[i+1] 为中心的回文串 (偶数)更新答案
class Solution {public String longestPalindrome(String s) {String result="";for(int i=0;i<s.length();i++){if(result.length()<findsub_i(s,i,i).length()){result = findsub_i(s,i,i);}if(result.length()<findsub_i(s,i,i+1).length()){result = findsub_i(s,i,i+1);}}return result;}public String findsub_i(String s, int l,int r){//找以l,r为中心的最长回文子串while(l>=0 && r<s.length()){if(s.charAt(l)==s.charAt(r)){l--;r++;}else break;}if(r-l==1){//当l和r相邻时不存在回文子串return "";}else{return s.substring(l+1,r);//从下标为l+1开始到下标为r结束(不包含r,即r-1) [l+1,r)左闭右开}}
}
2、最长回文子序列
dp 数组的定义是:
在子串s[i..j]中,最长回文子序列的长度为dp[i][j]
public int longestPalindromeSubseq(String s) {int n = s.length();int[][] dp = new int[n][n];for(int i=0;i<n;i++){dp[i][i] = 1;}for(int i=n-2;i>=0;i--){ //从下往上for(int j=i+1;j<n;j++){ //从左往右if(s.charAt(i)==s.charAt(j)){dp[i][j] = dp[i+1][j-1]+2;}else{dp[i][j] = Math.max(dp[i][j-1],dp[i+1][j]);}}}return dp[0][n-1];}
3、最小插入次数构造回文串
dp数组,dp[i][j]的定义如下:
对字符串s[i..j],最少需要进行dp[i][j]次插入才能变成回文串
。若已知dp[i+1][j-1],怎么求dp[i][j]?
如果把s[i+1…j]变成回文串,那么在s[i+1…j]右边插入一个字符s[i]一定可以将s[i…j]变成回文;
同理,如果在步骤一中选择把s[i…j-1]变成回文串,在s[i…j-1]左边插入一个字符s[j]一定可以将s[i…j]变成回文。
public int minInsertions(String s) {int n = s.length();int[][] dp = new int[n][n];for(int i=0;i<n;i++){dp[i][i] = 0;//base case,当i=j,只有一个字符,本身就是回文串,不需要插入什么}for(int i=n-2;i>=0;i--){for(int j=i+1;j<n;j++){if(s.charAt(i)==s.charAt(j))dp[i][j] = dp[i+1][j-1];elsedp[i][j] = Math.min(dp[i+1][j],dp[i][j-1])+1;}}return dp[0][n-1];}
动态规划:回文串系列相关推荐
- 【动态规划 回文串11】LeetCode 516. Longest Palindromic Subsequence
LeetCode 516. Longest Palindromic Subsequence 本博客转载自:http://www.cnblogs.com/grandyang/p/6493182.html ...
- 【Hard 递归 动态规划 回文串15】LeetCode 730. Count Different Palindromic Subsequences
LeetCode 730. Count Different Palindromic Subsequences 博客转载自:http://zxi.mytechroad.com/blog/dynamic- ...
- 【动态规划 回文串13】LeetCode 647. Palindromic Substrings
LeetCode 647. Palindromic Substrings Solution1:我的答案 动态规划,易解 class Solution { public:int countSubstri ...
- 【回文串1 动态规划 马拉车算法】LeetCode 5. Longest Palindromic Substring
LeetCode 5. Longest Palindromic Substring LeetCode中与回文串相关的免费的题目共有15道(5, 9, 125, 131, 132, 214, 234, ...
- 最长回文串--动态规划
最长回文串–动态规划 参考:https://writings.sh/post/algorithm-longest-palindromic-substring class Solution {publi ...
- LeetCode之最大回文串--动态规划
1. 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1:输入: "babad"输出: "bab" 注意: ...
- 求最长回文串-从动态规划到马拉车之路(上)
要解决的问题: 给定一个字符串,要求求出这个字符串中的最长的回文串子串. 例子: cbddba的最长回文子串为 bddb cbdedba的最长回文子串为dbedb 由上面的例子可以看到,在考虑回文子串 ...
- 【回文串5 重点+动态规划】LeetCode 132. Palindrome Partitioning II
LeetCode 132. Palindrome Partitioning II Solution1:我的答案1 直接模仿131那道题的DFS解法,找其中size最小的.果不其然,因为超时只能部分AC ...
- leetcode系列--125.验证回文串
leetcode系列–第125题.验证回文串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 输入: "A ...
最新文章
- 26.angularJS $routeProvider
- BAT会看上哪样的中小公司程序员?
- java象棋人机代码_中国象棋人机对弈Java版源码
- 解决Button设置disabled后无法执行后台代码问题
- 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(八)
- java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式
- Android Studio下载、安装、配置及连接真机开发第一个App ——入门选手快进
- Python网页爬虫--
- pytorch 模型同一轮两次预测结果不一样_2020年的最新深度学习模型可解释性综述[附带代码]...
- 解决Linux上解压tar.gz文件报错 (gzip: stdin: not in gzip format)
- IDEA最全使用教程
- 剪贴板增强工具 Ditto
- 【ecshop二次开发】ecshop截取中文字符串的方法
- micrium ucprobe使用笔记
- 基于php的村镇干部绩效考核系统
- 英雄联盟一直连接不上服务器连接异常,LOL服务器连接异常怎么办
- 【综合类型第 28 篇】ReSharper 的安装、使用教程
- PTA 1100 校庆(Python3)
- 用C实现汉诺塔问题(体现每次移动时方块的位置变化和计算共移动多少次)
- 公公的MC开服启程之路