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; } } } }