最长回文子串

题目描述:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:
输入: "cbbd"
输出: "bb"

思路一:暴力法
找出所有子串->找出所有回文子串->找出最长回文子串。

public static String longestPalindrome(String s){
if(s.length()<1||s==null)
{
return "";
}
int n=s.length();
int length=0;
int maxlength=0;
String str=s.substring(0,1);
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
length=0;
for(int k=i,q=j;k<j;k++) {
if (s.charAt(k) == s.charAt(q)) {
q--;
length++;
length=length>k-i?length:k;
}
else{
length=0;
break;
} }
if(length>maxlength){
maxlength=length;
str=s.substring(i,j+1);
}
}
}
return str;
}

暴力法我用了三重循环,其中第一二重循环 ,用来找出所有子串,第三重循环用来判断是否是回文子串和是否是最大回文子串,注意情况是当输入为一个字符时,输出为该字符,当输入字符串没有回文子串时,输出为任意字符。我在这里默认输出为第一个字符。
时间复杂度很容易看到为O(n^3),所以仅仅是暴力方法是无法通过测试的。

思路二:中心拓展法
中心拓展算法,是我认为比较好的算法。因为回文字符串是从回文中心开始,两边互为镜像。所以依次取出字符串每个字符s.charAt(i)(回文字符串为偶数时,则取出两个相同字符s.charAt(i)和s.charAt(i+1)),向两边扩展。只要两边相等,则回文字符串长度增加二。最后找出最长的回文字符串即可。
例如abccbe,当取到字符c、c时候,向两边拓展一位,两边字符相等,回文字符串变为bccb,长度为4。继续拓展,字符不等则结束判断。继续取下一个字符进行拓展。

public static String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
int start = 0, end = 0;
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 > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
//由中心到两边拓展字符串
private static int expandAroundCenter(String s, int left, int right) {
int L = left, R = right;
//直至两边不在相等,停止拓展
while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
return R - L - 1;
}

这个算法的时间复杂度为O(n^2),空间复杂度O(1).当然这个问题还有一些其他的解法,例如使用动态规划法判断是否是回文字符串来优化暴力法,或者逆置字符串,使用最长公共子串的方法。感兴趣的可以自己百度一下。

Leetcode_5.最长回文子串的更多相关文章

  1. 最长回文子串-LeetCode 5 Longest Palindromic Substring

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

  2. 最长回文子串(Longest Palindromic Substring)

    这算是一道经典的题目了,最长回文子串问题是在一个字符串中求得满足回文子串条件的最长的那一个.常见的解题方法有三种: (1)暴力枚举法,以每个元素为中心同时向左和向右出发,复杂度O(n^2): (2)动 ...

  3. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  4. 1089 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa ...

  5. 51nod1089(最长回文子串之manacher算法)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...

  6. 求最长回文子串:Manacher算法

    主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右 ...

  7. [译+改]最长回文子串(Longest Palindromic Substring) Part II

    [译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...

  8. [译]最长回文子串(Longest Palindromic Substring) Part I

    [译]最长回文子串(Longest Palindromic Substring) Part I 英文原文链接在(http://leetcode.com/2011/11/longest-palindro ...

  9. Manacher's algorithm: 最长回文子串算法

    Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...

随机推荐

  1. 执行多条SQL语句,实现数据库事务(不可传入Sql参数)

    执行多条SQL语句,实现数据库事务(不可传入Sql参数) http://blog.csdn.net/hanxuemin12345/article/details/9980371

  2. freeswitch 使用info显示的通道变量

    2019-01-20 11:57:30.167311 [INFO] mod_dptools.c:1743 CHANNEL_DATA:Channel-State: [CS_EXECUTE]Channel ...

  3. CentOS7编译安装mysql-5.6.43

    Step 1:安装编译需要的软件和工具 [root@node-1 ~]# yum install gcc gcc-c++ cmake ncurses-devel bison Step 2:创建mysq ...

  4. L2-028 秀恩爱分得快(模拟)

    古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K.任意两个人如果同 ...

  5. Vue-input框checkbox强制刷新

    在引用input框的checkbox属性时,选中后会出现数据已经刷新,checkbox选中状态不会改变.这时在事件触发后可以调用this.$forceUpdate(),强制刷新页面解决这个问题. in ...

  6. 【转载】chown和chmod使用

    二.指令名称 : chown 使用权限 : root 使用方式 : chown [-cfhvR] [--help] [--version] user[:group] file... 说明 : Linu ...

  7. Codeforces Round #553 (Div. 2) B题

    题目网址:http://codeforces.com/contest/1151/problem/B 题目大意:给定一个n*m的矩阵,问是否可以从每一行中选择一个数,使得这n个数异或大于0,如果可以还要 ...

  8. Gulp入门及简单使用

    前言 什么是gulp?gulp有什么用?为什么用gulp? gulp是前端开发的一种构建工具. 构建工具可以帮助我们工程化地开发项目,比如搭建本地服务器.编译CSS预处理器.保存文件后自动刷新浏览器而 ...

  9. Mapnik 3.0.20编译安装

    1. 确定epel安装 yum install -y epel-release 2. 按照<CentOS7.2部署node-mapnik>一文中的步骤,手动安装 gcc-6.2.0 和 b ...

  10. JS判断一个数组中有无重复元素(数字)

    前段时间遇到了这个问题 也百度了很多 不过还是用自己的方法解决了 一个超级简单的方法 简单到令人发指 由于直接写文本太丑了 所以还是截图吧 嘻嘻嘻 假如有一个这样的数组 (这是假如  可能每个人的数据 ...