每日一练:LeetCode5 最长回文子串

题目:
在这里插入图片描述由题可得,我们要在一个字符串中找出一个最长的回文字符串(即这个字符串正过来读和反过来读是一样的),因为回文字符串也可以理解为从中间字符开始扩散遍历,左边和右边的字符是一样的,所以我们可以用中心扩展算法。
代码:

class Solution {
    public String longestPalindrome(String s) {
        // 用来储存最长回文字符串
        String res="";
        // 因为由题目可得示例1有两个长度为3的回文字符串,而最后返回的是第一个,所以我们应该从后往前遍历
        for(int i=s.length()-1;i>=0;i--){
            // 假设这个字符串长度为奇数,则从中心开始,它的第一个左边字符和第一个右边字符是同一个字符
            String s1=huiWen(s,i,i);
            // 假设这个字符串长度为偶数,则有两个中心字符,分别是当前遍历到的字符(左)和下一个字符(右)
            String s2=huiWen(s,i,i+1);
            // 将求得的回文字符串与当前最长回文字符串进行长度比较,来留下最长的回文字符串
            res=res.length()>s1.length() ? res:s1;
            res=res.length()>s2.length() ? res:s2;
        }
        return res;
    }
    public String huiWen(String s,int left,int right){
        // 从中心开始遍历,遍历到数组头部或者尾部就要结束遍历
        while(left>=0&&right<s.length()){
            // 如果当前遍历到的两个字符相同,可以继续向两边扩散
            if(s.charAt(left)==s.charAt(right)){
                left--;
                right++;
            }else{
                break;
            }
        }
        // 返回符合的片段,因为循环中断或结束时,当前的s.charAt(left)!=s.charAt(right)或已经越界,substring截取的范围是前闭后开,所以left要+1
        return s.substring(left+1,right);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值