5. Longest Palindromic Substring


Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

算法分析

方法1

从最左边的字符(指标为 i )开始,从末尾寻找同该字符相同的字符(指标为 j ),然后依次比较 i++ 和 j-- 处的字符,如果相同,++i 和 --j,继续进行比较。直到 j<=i,说明当前考察的子字符串为 Palindromic;否则不是 Palindromic。

该方法的弊端就是太容易做无用功了:因为很可能出现两端字符依次相等而只有中间一小段的字符不相等的情况了。比如 "abcdefghigfedcba",只有比较到中间才会发现 h 和 i 不相等。

方法2

基于上述的问题,我们比较字符串的时候,从当前考察的子字符串的中间开始比较,因为 Palindromic 的字符串一定是镜像的,也就是说从中间向两端依次相等。我们可以从 i=0 到 i=s.length()-1 来遍历原字符串 s ,只要得出以 s.charAt(i) 为中间字符的字符串和以 s.charAt(i)与 s.charAt(i+1) 为中间两个字符的字符串的镜像长度,去二者最大者,就可以得出当前考察的 i 的镜像长度。

方法3

方法2是从 i=0 到 i=s.length()-1 来考察的,这回导致一些没必要的考察,因为很可能比较长的镜像字符串在中间位置,而较短的镜像字符串在边缘位置,这样,边缘的较短的镜像字符串根本就没必要去考察,所以,我们应该从字符串 s 的中间开始考察镜像字符串,如果出现了中间某个镜像字符串的的长度已经到达了字符串 s 的末端(即 s.charAt(0)或 s.charAt(s.length()-1) ),那么就可以知道当前考察的子字符串就是最长的镜像字符串了。

Java 算法实现

public class Solution {

	public  String longestPalindrome(String s) {
if(s==null){
return null;
}
int start=0,end=0;
int length=s.length();
int mid1=(length-1)>>>1;
int mid2=length>>>1;
int len=1,lenTmp;
if(mid1!=mid2){ //此时原字符串的长度一定为偶数
lenTmp=getLen(s, mid1, mid2);
if(lenTmp>len){
len=lenTmp;
start=mid1-((len>>1)-1);//len一定是偶数
end=mid2+((len>>1)-1);
}
} int len1,len2;
for(int i=mid1,j=mid2;i>0&&j<length-1;i--,j++){
if(len>=((i<<1)+1)){
//接下来的长度已经不可能再比len更长了,没有比较的必要了
break;
}
len1=getLen(s, i, i);
len2=getLen(s, i-1, i);
lenTmp=Math.max(len1, len2);
if(lenTmp>len){
len=lenTmp;
start=i-(len>>>1);//i-((len-1)>>>1);
end=i+((len-1)>>>1);
if(len>=(i<<1)){
//已经达到最大长度,下面的长度就没有比较的必要了
return s.substring(start,end+1);
}
} len1=getLen(s, j, j);
len2=getLen(s, j, j+1);
lenTmp=Math.max(len1, len2);
if(lenTmp>len){
len=lenTmp;
start=j-((len-1)>>>1);
end=j+(len>>>1);
if(len>=((length-j)<<1)){
//已经达到最大长度,下面的长度就没有比较的必要了
return s.substring(start,end+1);
}
}
}
return s.substring(start,end+1);
} public int getLen(String s,int mid1,int mid2){
int L=mid1,R=mid2;
while(L>=0&&R<s.length()&&(s.charAt(L)==s.charAt(R))){
L--;
R++;
}
return (R-L-1);
}
}

LeetCode算法题5----Longest Palindromic Substring的更多相关文章

  1. 【LeetCode每天一题】Longest Palindromic Substring(最长回文字串)

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  2. LeetCode第五题:Longest Palindromic Substring

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  3. Leetcode:【DP】Longest Palindromic Substring 解题报告

    Longest Palindromic Substring -- HARD 级别 Question SolutionGiven a string S, find the longest palindr ...

  4. leetcode--5 Longest Palindromic Substring

    1. 题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximu ...

  5. LeetCode(5)Longest Palindromic Substring

    题目 Given a string S, find the longest palindromic substring in S. You may assume that the maximum le ...

  6. 刷题5. Longest Palindromic Substring

    一.题目说明 Longest Palindromic Substring,求字符串中的最长的回文. Difficuty是Medium 二.我的实现 经过前面4个题目,我对边界考虑越来越"完善 ...

  7. 【LeetCode算法题库】Day2:Median of Two Sorted Arrays & Longest Palindromic Substring & ZigZag Conversion

    [Q4] There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...

  8. LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法

    LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...

  9. Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)

    Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...

  10. LeetCode第[5]题(Java):Longest Palindromic Substring 标签:String、动态规划

    题目中文:求最长回文子串 题目难度:Medium 题目内容: Given a string s, find the longest palindromic substring in s. You ma ...

随机推荐

  1. CSS02--四种样式、背景、文本、链接状态、表格样式

    接上面的“CSS01”,我们接着来说一下样式.很多人不知道的是一个HTML元素有四种样式,分别是浏览器默认样式.外部样式.内部样式.内联样式,而它们的优先级是越来越高的,后面的样式会覆盖前面的样式.多 ...

  2. 2018-2019 20165226 Exp7 网络欺诈防范

    2018-2019 20165226 Exp7 网络欺诈防范 目录 一.实验内容说明及基础问题回答 二.实验过程 1.简单应用SET工具建立冒名网站 2.ettercap DNS spoof 3.结合 ...

  3. kao shi

    1 #include "date.h" #include "utils.h" #include <iostream> using std::cout ...

  4. Vue 混入(mixins)

    详细参考官方文档 基础 混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. ...

  5. Python+USB+Vnet+FTP传输文件开发记录

    做一个Python+USB+Vnet+FTP传输文件开发记录

  6. javascript中操作元素属性

    1. setAttribute():设置属性的值: getAttribute():得到属性的值: removeAttribute():移除属性: 2.offsetWidth:offsetWidth = ...

  7. 关于javascript的各种高宽

  8. 使用EditPlus编辑Linux上的文本文件

    在Linux上我们都使用vim 或者vi命令对文件进行编辑,但是我们习惯的一般都是windows系统, 那么怎么才能像在windows上一样编辑我们Linux上的文件呢?下面我们就来看看如何使用 wi ...

  9. 分布式一致性协议介绍(Paxos、Raft)

     两阶段提交 Two-phase Commit(2PC):保证一个事务跨越多个节点时保持 ACID 特性: 两类节点:协调者(Coordinator)和参与者(Participants),协调者只有一 ...

  10. android studio的jni和so

    1. android studio自己添加代码生成so 代码地址:https://github.com/maogefff/Android-Test-Sample/tree/master/MyJni 参 ...