博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode算法题5----Longest Palindromic Substring
阅读量:6679 次
发布时间:2019-06-25

本文共 2635 字,大约阅读时间需要 8 分钟。

#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
=((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

转载于:https://www.cnblogs.com/dongling/p/5837867.html

你可能感兴趣的文章
springboot+Druid+oracle 配置p6spy
查看>>
Maven编译、打war包
查看>>
WP8.1开发:简单的天气预报应用
查看>>
九 循环
查看>>
第十三周项目2-形状类族的中的纯虚函数
查看>>
组织炎症水平高的RA患者接受TNF拮抗剂治疗的效果更好
查看>>
[洛谷P3709]大爷的字符串题
查看>>
通过映射关系 动态转义为统一格式的数据 (支持 JSON 和 XML )
查看>>
ajax跨域解决方案(服务端仅限java)
查看>>
Shell 文本处理三剑客之grep
查看>>
如何写出让人看了恶心的代码
查看>>
http状态码
查看>>
好记性不如烂笔杆-android学习笔记<十五> GridView简单用法
查看>>
最短路径
查看>>
表格相关技巧(双击启动事件、取得行号、定义表格的读写属性)
查看>>
ubuntu server vsftpd 虚拟用户及目录
查看>>
GCD多线程使用
查看>>
[转载] 格式化字符串漏洞原理介绍
查看>>
python小项目之微信远程控制
查看>>
Mysql本地安装多实例后启动遇到的问题
查看>>