[dp]Leetcode 5. Longest Palindromic Substring

输入:一个字符串s
输出:最长的回文子串
规则:“abba"是一个回文
分析:输入是"babad”,输出"bab"。这个问题不能再按照之前分段的思路解决,或者说完全按照之前的思路。

之前的思路是:如果字符串只包含b,只包含ba,只包含bab…

因为要判断回文是要有以某个点为圆心的思想。最直观的感觉是从中间位置(n/2)开始判断。但思路没有进行下去。

如果已知"aba"是一个回文,那么"babab"也是一个回文。这是dp的核心逻辑。(怎么找到这个逻辑?)
dp[i][j]=true,如果字符串从i到j是一个回文dp[i][j]=true,如果字符串从i到j是一个回文dp[i][j]=true,ijdp[i][j]=false,如果字符串从i到j不是一个回文dp[i][j]=false,如果字符串从i到j不是一个回文dp[i][j]=false,ij
如果s[i]=s[j]并且dp[i+1][j−1]=trues[i]=s[j]并且dp[i+1][j-1]=trues[i]=s[j]dp[i+1][j1]=true,那么dp[i][j]=truedp[i][j]=truedp[i][j]=true
基本情况是:dp[i][i]=truedp[i][i]=truedp[i][i]=true,单个元素是回文;dp[i][i+1]=true,当s[i]=s[i+1]dp[i][i+1]=true,当s[i]=s[i+1]dp[i][i+1]=true,s[i]=s[i+1],相邻元素相同。
吐槽:一般动态方程都是从dp[i-1]到dp[i],怎么会想到可以从dp[i+1]到dp[i]。
这段代码编写也会是难点。

	public String longestPalindrome(String s) {if(s==null || s.length()==0) return s;int n = s.length();boolean[][] dp = new boolean[n][n];int maxlen = 1;int start = 0;for(int i=0;i<n;i++){dp[i][i] = true;if(i<n-1 && s.charAt(i)==s.charAt(i+1)){dp[i][i+1]=true;start = i;maxlen=2;}}for(int j=2;j<n;j++){for(int i=0;i<j;i++){if(dp[i+1][j-1] && s.charAt(i) == s.charAt(j)){dp[i][j]=true;if(j-i+1>maxlen){maxlen = j-i+1;start = i;}}}}return s.substring(start,start+maxlen);}

分析2:仍然是一种以某个点为中心的思想,一个回文字符串中心的点可能是一个,也可能是两个。会有2n-1个中心点。
例如"babad"。
以b为中心,ba为中心
以a为中心,以ab为中心
以b(第2位)为中心,以ba为中心

直到结束

 public String longestPalindrome(String s) {if(s==null || s.length()==0) return s;int start = 0;int maxLen = 1;for(int i=0;i<s.length();i++){int len1 = expandAroundCenter(s,i,i);int len2 = expandAroundCenter(s,i,i+1);int len = Math.max(len1,len2);if(len>maxLen){start = i - (len-1)/2;maxLen = len;}}return s.substring(start,start+maxLen);}private int expandAroundCenter(String s ,int left,int right){while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right)){left--;right++;}return right-left -1;}

分析3:Manacher 算法

public String longestPalindrome(String s) {if(s==null || s.length()==0) return s;char splitChar = '#';String str = changeString(s,splitChar);int n = str.length();int[] dp = new int[n];int max = 1;int middel = 1;for(int i=1;i<n;i++){int step = 0;int l = i-1;int r = i+1;while(l>=0 && r<n && str.charAt(l)==str.charAt(r)){l--;r++;step++;}dp[i] = step;if(step>max){max = step;middel = i;}}int start = (middel - max)/2;        return s.substring(start,start+max);}private String changeString(String s,char splitChar){StringBuilder str = new StringBuilder();str.append(splitChar);for(int i=0;i<s.length();i++){str.append(s.charAt(i));str.append(splitChar);}return str.toString();}

参考文章:link
link

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]38.隐蔽信道和侧信道的区别

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 隐蔽信道和侧信道是两种不同的信息泄露信道 隐蔽信道使用目的不是通信的机制。例如&#xff0c;写和检查文…

NFA和DFA的区别

NFADFA初始状态不唯一唯一弧上的标记字(单字符字/ε)字符(串)转换关系非确定确定对于每个NFA M都存在一个DFA M 使得 L(M) L(M) 转载于:https://www.cnblogs.com/masterchd/p/11061281.html

spring学习(33):id和name

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

线性回归与 logistic回归

线性回归 算法方程&#xff1a;hθ(x)∑i0nθixiθTxh_{\theta}(x)\sum_{i0}^{n} \theta_{i} x_{i}\theta^{T} xhθ​(x)∑i0n​θi​xi​θTx 损失函数&#xff1a;J(θ0,θ1,…,θn)12m∑i1m(hθ(x(i))−y(i))2J\left(\theta_{0}, \theta_{1}, \ldots, \theta_{n}\right)\f…

[高效时间管理] 番茄工作钟 windows版本

【背景】 2019年本人学会了记录每日时间&#xff08;将每日分割成半小时一段的时间&#xff09; &#xff0c;但似乎是为了完成而完成&#xff0c;效果不佳&#xff0c;手机端的番茄钟总是诱惑太多&#xff0c;就在准备tb计时器的时候&#xff0c;发现了宝藏软件。 个人整理知…

IDEA设置取消自动显示参数提示

IDEA设置取消自动显示参数提示 最近在使用IDEA的过程中&#xff0c;发现方法中一直显示形参名的提示&#xff0c;无法选中&#xff0c;也无法删除&#xff0c;基于不同人的使用习惯不同&#xff0c;有的人不喜欢这种提示&#xff0c;我也在网上寻找各种解决方案&#xff0c;由于…

spring学习(34):构造函数依赖注入

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

[高效时间管理]复盘篇

【背景】 2019年本人在公众号中阅读了《时间管理&#xff0c;这篇就够了》&#xff0c;学习了其中的内容并开始记录每日所做&#xff0c;偶尔晚上进行复盘&#xff0c;对督促学习和反思起到一定的作用&#xff0c;故向大家分享经验。 为什么要时间管理&#xff1f; 时间管理…

PHP内存管理机制与垃圾回收机制

转载&#xff1a;https://www.cnblogs.com/zk0533/p/5667122.html PHP内存管理机制 var_dump(memory_get_usage()); //获取内存 $a "laruence"; //定义一个变量 var_dump(memory_get_usage()); //定义变量之后获取内存 unset($a); …

139. Word Break

目录题目描述分析暴力搜索记忆化回溯动态规划题目描述 给定一个字符串数组作为词典&#xff0c;再给定一个字符串。判断一下用词典中的词是不是可以组成这个字符串。 注意&#xff1a;词典中的词可以使用多次&#xff1b;词典中不存在重复的词 例如&#xff1a; 输入: s “le…

spring学习(35):c名称空间注入

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

Element-UI 表单验证规则rules 配置参数说明

官方文档 : https://github.com/yiminghe/async-validator转载于:https://www.cnblogs.com/itstac/p/11063125.html

[能力提升][费曼学习法]学习方法

【背景知识】 费曼学习法 费曼学习法可以简化为四个单词&#xff1a;Concept &#xff08;概念&#xff09;、Teach &#xff08;教给别人&#xff09;、Review &#xff08;评价&#xff09;、Simplify &#xff08;简化&#xff09;。 第一步&#xff1a;把它教给一个小孩…

338. Counting Bits

输入&#xff1a;一个正整数n 输出&#xff1a;一个数组 规则&#xff1a;输出的数组分别表示0<x<n0<x<n0<x<n&#xff0c;范围内x的二进制表示中有多少个1。 示例&#xff1a;输入2&#xff0c;输出[0,1,1]。 分析&#xff1a;这道题目很直观。如果计算数字…

spring学习(36):注入简单类型

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offer][JAVA]面试题第[05]题[替换空格][StringBuilder/Buffer] [剑指offer][JAVA]面试题第[06]题[从尾到头打印链表][栈][递归] [剑指…

41. First Missing Positive

输入&#xff1a;一个没有排序的正数数组nums 输出&#xff1a;在 nums数组中未出现的最小的正整数 规则&#xff1a;数组中的元素可能是负数&#xff0c;也可能重复。要求时间复杂度O(n)&#xff0c;空间复杂度O(1)。 分析&#xff1a;题目其实很简单&#xff0c;遍历一次放入…

spring学习(37):注入list类型

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

【小技巧】【牛客网】【JAVA】在线输入输出练习

【总结】 1. 一直输入模板 import java.util.*; public class Main{public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNext()) {//操作}} }2. 有组数或者输入个数 import java.util.Scanner; public class Main{public static voi…

你是一直认为count(1)比count(*)效率高么?

MySQL count(1) 真的比 count(*) 快么? 反正同事们都是这么说的&#xff0c;我也姑且觉得对吧&#xff0c;那么没有自己研究一下究竟&#xff1f;如果我告诉你他们一样&#xff0c;你信么&#xff1f; 有 Where 条件的 count&#xff0c;会根据扫码结果count 一下所有的行数&a…