閒來無事,刷題玩耍~
題目如下: 求最長迴文子串
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
大意就是給你一個字串,求其中最長的迴文字串,最大長度1000.
王老菊說遇事不決莽一波 第一次上的演算法是暴力求解,時間複雜度n^3,不出所料的超時了~
以下是AC的演算法:
根據迴文串的特點,在中軸兩側對應位置的字元應當相等。
將一個位置pos作為中軸,遍歷兩側的字元,直到不相等或超出範圍為止,即可求得以此pos為中軸的最長迴文串。
以上情況僅適用於迴文串的字元為奇數時,存在中軸字元。當迴文串的字元數為偶數時,將pos和pos+1同時作為中軸,向兩側擴充套件遍歷即可。
演算法的時間複雜度為o(n^2),提交AC
程式碼如下,詳見註釋:
package leecode;
/**
* 最長迴文字串
* Created by shizhida on 16/4/21.
*/
public class P5_Longest_Palindromic {
/**
* 求最長迴文字串
* @param str
* @return
*/
public static String longestPalindromic(String str){
int maxlength = 0;
int lpos = 0,rpos = 0;
for(int i=0;i<str.length();i++){
//假設為奇
int len1 = searchAround(str,i,0);
//假設為偶
int len2 = searchAround(str,i,1);
if(len1>maxlength)
{
maxlength = len1;
lpos = i-len1/2;
rpos = i+len1/2+1;
}
if(len2>maxlength)
{
maxlength = len2;
lpos = i-len2/2+1;
rpos = i+len2/2+1;
}
}
System.out.println(maxlength);
return str.substring(lpos,rpos);
// return maxlength;
}
/**
* 從中心點開始校驗左右
* @param str
* @param pos
* @param sub
* @return
*/
public static int searchAround(String str,int pos,int sub){
int l = 0,//左側延伸
r = 0+sub,//右側延伸
length=0;//最終長度
while(pos-l>=0&&pos+r<str.length()&&//超出範圍
str.charAt(pos-l)==str.charAt(pos+r)//兩側不等
){
length = r+l;//長度為左+右+差值
//同步擴大範圍
l++;
r++;
}
return length+1;//會漏掉中間一個(奇)或少算旁邊一個(偶),所以都要+1
}
}
複製程式碼