Skip to content

Latest commit

 

History

History
108 lines (70 loc) · 2.55 KB

File metadata and controls

108 lines (70 loc) · 2.55 KB

回文

125. 验证回文串

判断是否回文:

思路是双指针和滑动窗口。

class Solution {
    public boolean isPalindrome(String s) {

        int len = s.length();
        int left = 0;
        int right = len-1;

        while(left < right){
              
           char lc = s.charAt(left);
           char rc = s.charAt(right);

           if (!Character.isLetterOrDigit(lc)){

               left++;
               continue;
           }

           if (!Character.isLetterOrDigit(rc)){

               right--;
               continue;
           }

           if (Character.toLowerCase(lc) != Character.toLowerCase(rc)){
               return false;
           }

           left++;
           right--;


        }

        return true;

    }
}

5. 最长回文子串

解决该问题的核心是从中心向两端扩散的双指针技巧

如果回文串的长度为奇数,则它有一个中心字符;如果回文串的长度为偶数,则可以认为它有两个中心字符,如果输入相同的 lr,就相当于寻找长度为奇数的回文串,如果输入相邻的 lr,则相当于寻找长度为偶数的回文串。

class Solution {
    public String longestPalindrome(String s) {

        String res = "";

        for(int i=0; i < s.length(); i++){

            String odd = palindrome(s,i,i);
            String even = palindrome(s,i,i+1);
 
            res = odd.length() > res.length() ? odd : res;
            res = even.length() > res.length() ? even : res;


        }

        return res;

    }

    /**
    * 以 left和 right 为中心向两边扩展,找到最长的回文子串
    */
    public String palindrome(String s,int left,int right){


        while(left >=0 && right< s.length() ){

           if (s.charAt(left) == s.charAt(right)){
                 // 双指针,向两边展开
                left--;
                right++;
           }else{
               break;
           }

        }
        // 返回以 s[l] 和 s[r] 为中心的最长回文串
        //注意这里的substring函数:
        //beginIndex – the beginning index, inclusive.
        //endIndex – the ending index, exclusive.
        // 参数下标从0开始,包括第一个参数,不包括第二个参数,左闭右开,所以如果两个参数写的一样,那么返回空串
        return s.substring(left+1,right);
        
    }

}

参考