最長回文子串

2021-10-20 20:29:02 字數 1968 閱讀 1587

示例 1:

輸入:s = "babad"

輸出:"bab"

解釋:"aba" 同樣是符合題意的答案。

2.1  思路分析

對於長度小於2的字串,一定是回文串,我們直接返回即可;

然後暴力列舉長度大於2的字串,這是個常用的演算法,若當前字串是回文串,並且其長度大於之前回文字串的長度,那麼就更新回文串長度,還要更新當前回文串的起始索引,目的是返回結果;

判斷字串是否為回文串也是乙個常用的演算法;

2.2  **實現

class solution 

int maxlen = 1;

int begin = 0;

char ch = s.tochararray();

//索引i,j分別代表回文串的左右邊界

for(int i = 0; i < len - 1; i++) }}

return s.substring(begin, begin + maxlen);

}//該方法判斷是否為回文串

private boolean helper(char ch, int left, int right)

left++;

right--;

}return true;}}

2.3  複雜度分析3.1  思路分析

定義狀態:

轉移方程:

邊界條件:當 j - 1 - (i + 1)  + 1 了,直接返回true;

索引 i 為左邊界,索引 j 為右邊界,i 始終小於等於 j,因此需要填寫乙個**的上三角部分;

因為3.2  **實現

class solution 

// 最長回文串長度至少為1

int maxlen = 1;

int begin = 0;

boolean dp = new boolean[len][len];

// 初值

for (int i = 0; i < len; i++)

// 根據目標位置,選擇dp**上三角遍歷方式

for (int j = 1; j < len; j++) else else

}// 更新最長回文串的起始索引和長度

if (dp[i][j] && j - i + 1 > maxlen) }}

return s.substring(begin, begin + maxlen);}}

3.3  複雜度分析4.1  思路分析

中心擴散法:遍歷每個索引,以這個索引為中心向兩邊擴散,看看能擴散多遠;

需要注意的是,回文子串的長度可能為偶數,也可能為奇數,於是利用乙個方法來返回當前索引下的奇數回文串與偶數回文串,取長度最大的串就是當前索引下的最大回文串;

方法的功能:①當傳入相同索引下標時,返回的是奇數回文串;②當傳入相鄰索引下標時,返回的是偶數回文串;

4.2  **實現

class solution 

string res = null;

int maxlen = 0;

for(int i = 0; i < len - 1; i++)

}return res;

}//該方法返回最長回文子串

private string centerspread(string s, int i, int j) else

}return s.substring(i + 1, j);}}

4.3  複雜度分析

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...

最長回文子串

輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...