(LeetCode) Longest Palindromic Substring

https://leetcode.com/problems/longest-palindromic-substring/description/

题目即为最长回文子串。 暴力法即N3的方法,枚举所有子串,判断是否回文。这个方法在LeetCode肯定是超时的。

 public  String longestPalindrome(String s) {
            int max = 0;
            String result = null;
            if(s.length() == 1){
                return s;
            }
            for(int i = 0 ; i<s.length();i++){
                for(int j = i+1 ; j<s.length();j++){
                    int len = j-i;
                    String s1 = s.substring(i,j+1);
                    if(isRalindrome(s1)){
                        if(max < j-i){
                            max = j-i;
                            result = s1;
                        }
                    }
                }
            }
            if(null == result){//如abcd, a也算回文,返回第一个。。
                return String.valueOf(s.charAt(0));
            }
            return result;
    }


    private boolean isRalindrome(String s){
            for(int i = 0 ; i <s.length();i++){
                if(s.charAt(i) != s.charAt(s.length()-1-i)){
                    return false;
                }
            }
            return true;
    }

对于遍历方法,其实是可以优化的,我们可以从最长的字符串开始搜索,一旦找到回文,就终止迭代,从最外一对字符,向中间推进

 public  String longestPalindrome(String s) {
        for (int size = s.length(); size > 0; size--) {
            for (int low = 0, high = low + size - 1; high < s.length(); low++, high++){
                String s1 = s.substring(low,high+1);
                if(isRalindrome(s1)){
                    return s1;
                }
            }
        }
        return s.substring(0,1);
}

继续优化,即减少字符串子串遍历次数,因为回文是对称的,我们可以从子串中心点开始遍历,以每个位置为中心遍历完即可。需要注意,探测到边界,更长的串就不必考虑。

ab|ba

abbba

class Solution {
     private  int max = 0;
    private  String result = "";
   
         public  String longestPalindrome(String s) {
            if(s.length() == 1){
            return  s;
        }
        for (int i = 0; i < s.length(); i++) {
            isRalindrome(s, i, i);
            isRalindrome(s, i, i + 1);
        }
        return result;

    }


    private void isRalindrome(String s,int low,int high){
          while (low >= 0 && high < s.length()) {
            if (s.charAt(low) == s.charAt(high)) {
                if (max < high - low + 1) {
                    max = high - low + 1;
                    result = s.substring(low, high + 1);
                }
                low--;
                high++;
            }
            else{
                return;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/zhouy1989/article/details/79786383