当前位置:网站首页>数组与字符串8-最长回文子串
数组与字符串8-最长回文子串
2022-08-03 05:25:00 【花开花落夏】
最长回文子串
题目:给你一个字符串 s,找到 s 中最长的回文子串。
二 题解
对于回文字符串,如下图所示,有两种情况:
第一种是以一个字符串为中心,该字符串两边对应位置的元素相等。第二种是以两个字符串为中心,字符串两边对应位置的元素相等。
解题思路是:遍历字符串中的每一个字符,每遍历一个字符,就把该字符(index = i)作为中心,来求该字符的回文子字符串。由于子字符串有奇数回文子串和偶数回文子串两种情况,因此对于每个中心字符(index=i),都求奇数回文子串和偶数回文子串两种情况。之后取两个子串中更长的那个,作为该中心字符串的回文子串。同时在遍历的过程中,使用i与max来记录拥有最长回文子串的中心字符的位置,和子串长度。
class Solution {
public String longestPalindrome(String s) {
if(s.length()<2){
return s;
}else{
int begin = 0;
int max = 0;
for(int i=0;i<s.length()-1;i++){
int oddMax = getPalindrome(s,i,i);
int evenMax = getPalindrome(s,i,i+1);
if(Math.max(oddMax,evenMax)>max){
begin = i;
max = Math.max(oddMax,evenMax);
}
}
return s.substring(begin-(max-1)/2,begin+1+max/2);
}
}
private int getPalindrome(String s,int left,int right){
while(left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)){
left --;
right ++;
}
return right-left-1;
}
}
三 动态规划解法
首先,对于一个字符串,例如:cacbcdf,求它的最长回文子串。我们可以先使用暴力搜索的想法来考虑:
对于c:
c
ca
cac
cacb
cacbc
cacbcd
cacbcdf
对于a:
a
ac
acb
acbc
acbcd
acbcdf
依次类推,在暴力搜索中,从cacbcd与acbc我们就可以看出,在重复的判断acbc是否为回文字符串。因此我们可以使用动态规划的思想来解题。对于一个字符串s的子串s[l][r],是否为回文子串,取决于s[l]==s[r]且s[l+1][r-1]为回文子串。此时:r-1>l+1,即r>l+2时,s[l+1][r-1]才为一个字符串。我们可以根据下图构建动态规划的状态转移方程,对于left=0,right=5的子字符串,若s[l]==s[r]且s[1][4]为回文子串,则s[0][5]为回文子串。因此我们可以一列一列的填表,下一列进行s[l+1][r-1]是否为回文子串的判断时,总会用到前面已经计算出来的结果。
代码:
class Solution {
public String longestPalindrome(String s) {
if(s.length()<2){
return s;
}else{
int left = 0;
int right = 0;
int Max = 1;
Boolean[][] tmp = new Boolean[s.length()][s.length()];
for(int i=0;i<s.length();i++){
tmp[i][i]=true;
}
for(int r=1;r<s.length();r++){
for(int l=0;l<r;l++){
if(s.charAt(l)==s.charAt(r)&&(r-l<=2 || tmp[l+1][r-1])){
tmp[l][r]=true;
if(r-l+1>Max){
Max = r-l+1;
left = l;
right = r;
}
}else{
tmp[l][r]=false;
}
}
}
return s.substring(left,right+1);
}
}
}
动态规划效率不是很高呀
边栏推荐
- MySql的Sql语句的练习(试试你能写出来几道呢)
- 自监督论文阅读笔记 Self-Supervised Visual Representation Learning with Semantic Grouping
- Qemu 搭建Armv8 平台
- 自监督论文阅读笔记 Incremental-DETR:Incremental Few-Shot Object Detection via Self-Supervised Learning
- 浮点型数据在内存中存储的表示
- 常见的电子元器件分类介绍
- B.1#【编程语言】—1 arm 汇编指令
- VCC(电源)和 GND(地)之间电容的作用
- 采用Trench肖特基二极管,实现功率密度的显著提升
- 9. Please introduce the class loading process, what is the parent delegation model?
猜你喜欢
进程间通信IPC - 信号量
Windos 内网渗透之Token的使用
IPC 通信 - IPC
MATLAB自带的dwt2和wavedec2函数实现基于小波变换的自适应阈值图像边缘检测
2021-03-22
什么是参数化设计,通过实操了解一下? | SOLIDWORKS 操作视频
全球一流医疗技术公司如何最大程度提高设计工作效率 | SOLIDWORKS 产品探索
Practice of MySql's Sql statement (try how many you can write)
自监督论文阅读笔记 Incremental-DETR:Incremental Few-Shot Object Detection via Self-Supervised Learning
二分查找4 - 搜索旋转排序数组
随机推荐
神经网络基础
内网渗透信息收集
6. What is the difference between Vector, ArrayList and LinkedList?(design, performance, safety)
稳压二极管的工作原理及稳压二极管使用电路图
2021-03-22
003_旭日X3派初探:利用无线串口通信控制舵机
设备树(devicetree)-dts语法
队列方法接收串口的数据
卷积神经网络入门
Eight, the difference between the interface of the abstract class
JSP的基本使用
常见的电容器有哪些?唯样商城
基于南航app直减自动出票
ZEMAX | 如何创建简单的非序列系统
Phase Vocoder的补充完善,Matlab音频变速不变调、变调不变速
自监督论文阅读笔记Index Your Position: A Novel Self-Supervised Learning Method for Remote Sensing Images Sema
Makefile自动推导的简单例程
建立平衡二叉树简单demo
SQLMAP介绍及使用
cmdline -[command line,__fdt_pointer,initial_boot_params] boot_command_line 获取