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