题记(1) 最长回文子串

题目:

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串


思路:

从下标为零开始遍历字符串,对于字符串的每一个“点”,采用中心扩散法。即从每一个位置出发,向两边扩散,遇到不是回文时结束。

假设当前在字符串的位置“i”,字符串为“acdbbdaa”:

1.先向左边扩散,寻找与当前位置(i)相同的字符,直到遇到不相同的为止;

2.再向右边扩散,寻找与当前位置(i)相同的字符,直到遇到不相同的为止;

3.接着双向扩散,直到左右不相等。如下图所示

 因为我们最后要得到最长回文子串的起始下标,所以需要maxStart用于记录。len为遍历时每一轮的字串长度,maxlen为最大字串长度,当len>maxlen时需要更新maxlen。

Java代码如下:

class Solution {
    public String longestPalindrome(String s) {
        if(s==null || s.length() == 0){
            return "";
        }
        int strlen = s.length();
        int left = 0;
        int right = 0;
        int maxlen = 0;
        int maxStart = 0;
        int len = 1;
        for(int i=0;i<strlen;i++){
            left = i-1;
            right = i+1;
            while(left>=0 && (s.charAt(left) == s.charAt(i))){
                left--;
                len++;
            }
            while(right<strlen && (s.charAt(right) == s.charAt(i))){
                right++;
                len++;
            }
            while(left>=0 && right<strlen && s.charAt(left) == s.charAt(right)){
                len = len + 2;
                left--;
                right++;
            }
            if(len>maxlen){
                maxlen = len;
                maxStart = left;
            }
            len = 1;
        }
        return s.substring(maxStart+1,maxStart+maxlen+1);

    }
}

--小菜学习记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值