博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从0打卡leetcode之day 6--最长回文串
阅读量:7121 次
发布时间:2019-06-28

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

题目描述

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

示例1

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

示例2

输入: "cbbd"输出: "bb"

解题

对于这道题,最简单的方法就是暴力求解了。对于很多算法题,我想会暴力求解是最基本的能力,但也绝不能满足于暴力,而且很多题的暴力解法都是很类似的。

这道题与其他的暴力解法一样,外面两层for循环遍历找出所以子串,第三层循环用来判断该子串是否为回文串。

这种算法的时间复杂度为O(n3)。这里我就不给出代码了

优化策略

我们可以换一种思想,假如字符串为回文串,那么把这个字符串首尾两个字符去掉,剩下的子串也会是一个回文串。

基于这种想法,我们就可以这样做了:一个for循环遍历所有字符,单个字符也可以是一个回文串,然后向这个字符的两边各自添加一个字符。判断该字符串是否还是回文串。

例如a是一个回文串,向a的两边添加一个字符,假如添加的这两个字符相同的话,那么添加之后的字符串还是回文串,如果两个字符串不同的话,那么添加之后就不是字符串了,。继续遍历下一个字符。,,,,,

需要注意的地方

不过这里有一个需要注意的地方,我们上面是从单个字符的两边开始向两边拓展添加字符的,这种情况下,最终回文串字符个数是奇数的,例如aba,cabac。

但是回文串的字符个数也有可能是偶数的,例如bb,cbbc,那么对于这种情况,按照单个字符向两边拓展的话就会出问题,因此对于这种情况,我们要从s[i],s[i+1]两边开始拓展。

知道了思路,可以自己先动手试一下能不能写出来。

我做的代码去下:

public String longestPalindrome(String s) {        //先判断是否为空或者长度小于1        //把||写成了&&害我找了好久都不知道错在哪...        if(s == null || s.length() < 1){            return "";        }        int left = 0;//用来记录子串的起始位置        int right = 0;//用来记录子串的末尾位置        for(int i = 0; i < s.length(); i++){            //通过findMore这个方法来拓展            //bab这种情况            int t1 = findMore(s, i, i);//bab这种情况            //abba这种情况            int t2 = findMore(s, i, i+1);            //选出比较长的那个            int max = Math.max(t1, t2);            if(max > right - left){                left = i - (max - 1)/2;                right = i + max/2;            }        }        return s.substring(left, right+1);    }    public int findMore(String s, int left, int right){        while(left >= 0 && right < s.length()                && s.charAt(left) == s.charAt(right)){            left--;            right++;        }        return right - left - 1;    }

这种方法的时间复杂度为O(n2)。

不过我去看了官方的解答,那里貌似提供了一个更牛的解法链接,这个解法的时间复杂度为O(n)。假如你有兴趣的话,可以去研究下。

链接:

关注公我的众号:苦逼的码农,获取更多原创文章,后台回复礼包送你一份特别的资源大礼包。同时也感谢把文章介绍给更多需要的人。。

转载地址:http://dbsel.baihongyu.com/

你可能感兴趣的文章
CGI的一些知识点
查看>>
SQL Server误区30日谈-Day14-清除日志后会将相关的LSN填零初始化
查看>>
冒泡排序
查看>>
Java中的final
查看>>
简明Linux命令行笔记:touch
查看>>
Top 命令使用
查看>>
如何在多台机器上共享IOS证书
查看>>
最近遇到的一个问题,求解释
查看>>
IOS 开发,调用打电话,发短信,打开网址
查看>>
word实现转换成图片的实现
查看>>
人生如梦
查看>>
预装Win8系统的电脑安装Win7的方法(EFI安装Win7)
查看>>
Vim按键映射
查看>>
员工辞职是为了炒老板鱿鱼
查看>>
远程管理WinRM,Enter-PSSession
查看>>
2013第12周五小结
查看>>
32位与64位原子操作的问题
查看>>
jquery 引用
查看>>
Xamarin 2.0编译报错缺少Google Maps Library
查看>>
Web网站的性能测试工具
查看>>