Description:
Given a string s,
find the longest palindromic substring in s.
You may assume that the maximum length of s is
1000.
Note:
“aba” is also a valid answer when you input "babad".
Solution:
Analysis and Thinking:
題目要去尋找給定字符串的最大回文子串,且同一字符串的結果可能有多個,只需給出其中一個即可。本文采用了backtrack的方法,爲了排除不必要的判斷增加的時間複雜度,可以從字符串每個單一字符開始向兩邊拓展,遇到相同字符相連的可以合併判斷。以當前遍歷位置的字符爲中心往兩邊判斷,一旦失敗,就不用往外判斷。其中,本文將形如"xbbbby"以及“abcda”兩類字符串分開解決。
Steps:
1.輸入測試字符串,判斷是否爲空或長度是否爲1,若是,直接返回輸入
2.定義並初始化記錄最大回文子串的開始位置、長度、字符串遍歷計數器三個變量startPos、maxStrLength、counter
3.判斷輸入字符串迴文子串是否形如"abcda",若是,以遍歷位置爲中心向兩邊拓展,其中向左拓展爲i-counter,向右
拓展爲i+counter,一旦左右字符相等,更新最大長度爲counter*2+1,開始位置爲i-counter+2,並以當前迴文子串爲中心,繼續外拓。
4.若否,奢侈repeatCounter變量,用於計數同一字符重複次數,將counter置0,向右拓展,直到下一個字符不等於當前字符,並
使得遍歷位置i以及計數器repeatCounter隨着遍歷加1,之後進行形如3的操作,只是向左拓展操作爲i-repeatCounter-counter
5.返回根據startPos,maxStrLength確定的子字符串
Codes:
class HW4Solution
{
public:
string getLongestPalindromic (string s)
{
if(s==""||s.size()==1)
return s;
int startPos=0,maxStrLength=0; //記錄子串開始位置與長度
for(int i=0;i<s.size()-1;i++)
{
int counter=1;
if(s[i]!=s[i+1]) //從一個點向兩邊拓展
{
while(i-counter>=0&&i+counter<s.size()&&s[i-counter]==s[i+counter])
++counter;
if((counter-1)*2+1>maxStrLength)
{
maxStrLength=(counter-1)*2+1;
startPos=i-counter+1;
}
}
else
{
int repeatCounter=0;
counter=0;
while(i+1<s.size()&&s[i]==s[i+1])
{
i++;
repeatCounter++;
}
while(i-repeatCounter>=0&&i+counter<s.size()&&s[i-repeatCounter]==s[i+counter])
counter++;
if((counter-1)*2+1+repeatCounter>maxStrLength)
{
maxStrLength=(counter-1)*2+1+repeatCounter;
startPos=i-counter+1-repeatCounter;
}
}
}
return s.substr(startPos,maxStrLength);//返回指定起始位置子串
}
};
Results: