LeetCode最长回文子串
输出: "bab"
注意: "aba" 也是一个有效答案。
输出: "bb"
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
StringBuilder strR=new StringBuilder(s).reverse();//倒置
int len=s.length();
int[][] arr=new int[len][len];
int maxlen=0;
int startIndex=0; for(int i=0;i<len;i++) {
for(int j=0;j<len;j++) {
if(s.charAt(i)==strR.charAt(j)) {
if(i==0||j==0) arr[i][j]=1;//边界
else arr[i][j]=arr[i-1][j-1]+1;
}
//len-j-1+arr[i][j]-1==j j(末尾的下标)-(len-j-1)(表示正着的开头下标)+1==arr[i][j](长度)
if((len-j-1+arr[i][j]-1==i)&&arr[i][j]>maxlen) {
maxlen=arr[i][j];
startIndex=len-j-1;
}
}
}
return s.substring(startIndex,startIndex+maxlen);
方法二动态规划:将填表的过程记录下来而不是从头来
二维boolean[][]数组记录是某两位是不是回文串
选取[l,r],s[l]==s[r]之间的字符串如果他是回文串,则[l+1,r-1]也是回文串
//str[l,r] s[l]==s[r] 判断dp[l+1,r-1]是否为真
if(s.isEmpty()) {
return "";
}
int len=s.length();
int strLen=1;
int startIndex=0; boolean[][] dp=new boolean[len][len]; for(int r=0;r<len;r++) {
for(int l=0;l<r;l++) {
char left=s.charAt(l);
char right =s.charAt(r);
if(left==right&&((r-l<=2)||dp[l+1][r-1])) {
dp[l][r]=true;
if((r-l+1)>strLen) {
strLen=r-l+1;
startIndex=l;
}
}
}
}
return s.substring(startIndex,startIndex+strLen);
方法三:马拉车!!!神奇的马拉车算法!!!
核心思路:求出每个i对应的p[i]->找到最大的p[i]->求出下标和长度,截取返回
零、处理奇偶
在字符串头+"^",尾加+"$"
在每两个字符串之间+“#”
偶数->+头尾(偶数)->+奇数个间隔->奇数
奇数->+头尾(奇数)->+偶数个间隔->奇数
一、求出P[i]
中心扩展算法:从i开始向两边扩展比较,因为需要两个for循环所以空间复杂度约为O(n^2),为了减少中心扩展算法的时间复杂度,增加镜像法
镜像法:
C:回文串的中心
R:回文串的右边界
p[i]:i对应的回文串长度
i_mirror:i关于C对应的镜像
R>=i时,因为C是某个回文串的中心,二i又在此回文串右边界的左边,i可以用对应的i-mirror表示p[i]减少中心扩展算法的循环,使它变为某一常数即时间复杂度降为线性的了,注意当i+p[i_mirror]>R时,p[i_mirror]不一定是p[i],因为只有在R的范围里面它才是回文串,所以p[i]=min(R-i,i[i_mirror]),在这个的p[i]基础上再使用中心扩展算法时循环的就减少了
C和R的更新:因为要尽量少的使用中心扩展算法,尽量多的使用镜像法,需要将R尽量变大,但是一个确定回文串对应的p[i]是一定的,即R是一定的,只有将右边i+p[i]更大的R更新才能达到目的,所以只要出现新的R大于当前C对应的R就要更新
二 、找到最大下标和长度
因为p[i]是#改变后的,所以在原字符串中maxlen=p[i]max,对应的下标为 (C对应的i - maxLen) / 2
public String longestPalindrome(String s) {
String T = preProcess(s);
int n = T.length();
int[] P = new int[n];
int C = 0, R = 0;
for (int i = 1; i < n - 1; i++) {
int i_mirror = 2 * C - i;
if (R > =i) {
P[i] = Math.min(R - i, P[i_mirror]);
}
while (T.charAt(i + 1 + P[i]) == T.charAt(i - 1 - P[i])) {
P[i]++;
}
if (i +P[i] > R) {
C = i;
R = i + P[i];
}
int maxLen = 0;
int centerIndex = 0;
for (int i = 1; i < n - 1; i++) {
if (P[i] > maxLen) {
maxLen = P[i];
centerIndex = i;
}
}
int start = (centerIndex - maxLen) / 2;
return s.substring(start, start + maxLen);
}
public static String preProcess(String s) {
int n = s.length();
if (n == 0) {
return "^$";
}
String ret = "^";
for (int i = 0; i < n; i++)
ret += "#" + s.charAt(i);
ret += "#$";
return ret;
}
}
LeetCode最长回文子串的更多相关文章
- leetcode -- 最长回文子串
		
题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
 - [LeetCode]最长回文子串 java
		
题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
 - LeetCode.5-最长回文子串(Longest Palindromic Substring)
		
这是悦乐书的第342次更新,第366篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第3题(顺位题号是5).给定一个字符串s,找到s中最长的回文子字符串. 您可以假设s ...
 - 求最长回文子串 - leetcode 5. Longest Palindromic Substring
		
写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...
 - LeetCode之“字符串”:最长回文子串
		
题目要求: 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串.例如,给出字符串 "abcdzdcab",它的最长回文子串为 & ...
 - LeetCode(5):最长回文子串
		
Medium! 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 长度最长为1000. 示例: 输入: "babad" 输出: "bab&quo ...
 - LeetCode:最长回文子串【5】
		
LeetCode:最长回文子串[5] 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: ...
 - LeetCode Golang  5. 最长回文子串
		
5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...
 - 最长回文子串 C++实现 java实现 leetcode系列(五)
		
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...
 
随机推荐
- Cucumber(3)——命令以及日志
			
目录 回顾 基本执行命令 关于日志的生成 回顾 在上一节中,我介绍了cucumber一些基本的语法内容,如果你还没有进行相关的了解或者环境的配置,你可以点击这里来进行了解一下 在本节中,我会对cucu ...
 - linux sysbench : CPU性能测试详解
			
1.sysbench基础知识 sysbench的cpu测试是在指定时间内,循环进行素数计算 素数(也叫质数)就是从1开始的自然数中,无法被整除的数,比如2.3.5.7.11.13.17等.编程公式:对 ...
 - Java优秀教程
			
1.java中局部变量是在栈上分配的: 2.数组是储存在堆上的对象,可以保存多个同类型变量: 3.在Java语言中,所有的变量在使用前必须声明. 4.局部变量没有默认值,所以局部变量被声明后,必须经过 ...
 - .NET中 kafka消息队列、环境搭建与使用
			
前面几篇文章中讲了一些关于消息队列的知识,就每中消息队列中间件,我们并没有做详细的讲解,那么,今天我们就来详细的讲解一下消息队列之一kafka的一些基本的使用与操作. 一.kafka介绍 kafka: ...
 - selenium 获取页面<input>标签的个数和各个属性的值
			
获取页面某个标签的数量.id.name.class的值,来辅助定位 List<WebElement> lw =driver.findElements(By.tagName( ...
 - [linux][MongoDB] mongodb学习(二):命令使用数据库
			
使用数据库 # 查看数据库 > show dbs admin 0.000GB local 0.000GB # 查看表(集合) > show tables # 删除集合 > db.us ...
 - [git] github上传项目(使用git)、删除项目、添加协作者
			
来源:http://www.cnblogs.com/sakurayeah/p/5800424.html (怕链接失败,所以直接就就复制过来啦,感谢作者) 一.注册github账号 github网址ht ...
 - Intellij IDEA 基础设置,个性化设置,好用的设置→_→
			
Intellij IDEA 个性化设置 Appearance & Behavior 外观和行为 Keymap 快捷键 Editor 编辑器设置 Plugins 插件 Version Contr ...
 - df卡住的解决办法
			
在使用网络存储时,如果网络存储出问题.比如使用NFS,网络中断,df -h会卡住 情形一 ctrl+c是能取消中断的,这种情况算是比较幸运.使用mount查看有哪些挂载点,将其卸载即可. 情形二 ct ...
 - 获取某个时间开始 之后的 N次[周几,周几]
			
废话不多说,直接上菜! 调用函数代码举例 //PS :这里需要注意的是 周日 是 0 !!!!! console.log(getBeforeDate(-10000)) //一万天之后的日期 conso ...