0
点赞
收藏
分享

微信扫一扫

leetcode100题 ---最长回文

f12b11374cba 2022-03-11 阅读 43

示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:

输入:s = “cbbd”
输出:“bb”

回文
大部分会想到的情况就是abacd
其中 aba就是最长回文
但是aaccd中 aacc也是最长回文
因此 我们将所有会出现的可能性先罗列一下

  1. ccc
  2. aba
  3. accd
  4. aabb
    所以对以上的情况进行归类,回文不管是长度是单数还是双数,他以回文的中心开始,必定是对称的或者是字符是相同的.
    对于对称的判断,算是通用的,不管它中心是否有相同的字符,我们都要考虑是否是对称的
    因此,我们只需要对相同的字符串进行判断即可.

       /*
        思路:
        如果一个字符串是回文,那他两侧的字符一定是一样的
        
        那我们只需要遍历所有的字符,判断两侧的字符是否相同,  
        左右指针接着往下走,
        当指针遇到不等的时候,就右指针➖左指针 
        与最大的进行比较 然后存储到返回的right left
        
        上述情况是单数的
        偶数的时候就是 遇到相同的字符就可以被判定为
        回文了
         */
    class Solution {
    public String longestPalindrome(String s) {
        //返回的最长的左右指针
        int tempLeft=0;
        int tempRight=0;
        //用来遍历str的左右指针
        int left=0;
        int right=0;
        int len = s.length();
        int maxLength = 0;
 		
 		//对字符串进行遍历,视i为中心
        for(int i = 0;i < len;i++){
            left = i;
            right = i;
            //相同的情况下 左右开始遍历
            
            //进行判断 是否有相同的字符出现 
            //如果有相同的字符 则一直往下走 并且比较长度
            if((i+1)<len && s.charAt(i)==s.charAt(i+1)){
                for (;(i+1<len)&&s.charAt(i)==s.charAt(i+1);i++){
                    right++;
                    if(maxLength < right-left+1){
                        tempLeft = left;
                        tempRight = i+1;
                        maxLength = right-left+1;
                    }
                }
            }

            else{
                right = i+1;
                left =  i-1;
            }
            
            for (;left>=0&&right<len;left--,right++){
                
                if(s.charAt(left)!=s.charAt(right)){

                    break;
                }

                
            }
            //最后一个判断,当对称的情况也已经跳出来后,就对left和right进行计算长度
            if(maxLength < (right-left+1)){
                maxLength = (right-left+1);
                tempLeft = left+1;
                tempRight = right-1;
            }
        }
        // System.out.println(tempRight);
        return s.substring(tempLeft,tempRight+1);

    }
}
举报

相关推荐

0 条评论