輸入乙個字串,求出其中最長的回文子串。子串的含義是:在原串中連續出現的字串片段。回文的含義是:正著看和倒著看相同。如abba和yyxyy。在判斷回文時,應該忽略所有標點符號和空格,且忽略大小寫,但輸出應保持原樣(在回文串的首部和尾部不要輸出多餘字元)。輸入字串長度不超過5000,且佔據單獨的一行。應該輸出最長的回文串,如果有多個,輸出起始位置最靠左的。
輸入一行字串,字串長度不超過5000。
輸出字串中的最長回文子串。
樣例
輸入:
confuciuss say:madam,i'm adam.
輸出:madam,i'm adam
解題思路:
使用動態規劃求解
dp[i][j] 表示字串下標為 i 到下標為 j 的子串為回文子串。
注意:1、需要將所有的空格,逗號之類的非字母的字元去掉
2、需要將所有字元都變為小寫或者大寫
3、輸出的時候,需要輸出原來的字串中的子串,即需要輸出空格,逗號之類的字元。
4、若存在多個相同長度的回文子串,則需要輸出最左邊的子串,如abab,需要輸出aba,而不是bab。
具體過程:
1、讀入字串
2、去掉字串中的非字母的字元並將其他字母轉換為小寫(或者大寫)
3、在轉換的過程中,需要記錄每個字母所對應的原來字串中的位置
4、之後就是求解乙個字串中的最長回文子串,與 leetcode5—最長回文子串 解法相同。
下面為ac**:
/*
* @description: problem a 【字串】最長回文子串
* @author:
* @date: 2020-05-04 16:13:17
* @lastedittime: 2020-05-04 17:01:13
* @lasteditors: please set lasteditors
*/#include
#include
#include
using
namespace std;
const
int max_n =
5010
;string str;
//表示輸入的字串
char temp[max_n]
;//表示去掉空格,逗號,以及都變成小寫的字串
int dp[max_n]
[max_n]
;//dp[i][j] 表示字串下標為 i 到下標為 j 是回文串
int index[max_n]
;//表示儲存temp字串下標在str中的本來的位置,方便輸出列印逗號以及空格
intmain()
if(str[i]
>=
'a'&& str[i]
<=
'z')
}//此時temp陣列中存放的都是小寫字母
//下面用正常的求解最長回文子串的解法即可
int start =0;
int max_length =1;
//表示最長回文字串的長度
int max_current =1;
//表示當前最長回文字串的長度
fill
(dp[0]
, dp[0]
+ max_n * max_n,0)
;int len = j;
// //len 表示 temp 陣列的長度
for(
int i =
0; i < len; i++)}
}}//下面為狀態轉換方程
for(
int l =
3; l <= len; l++)}
}}//輸出最長回文子串
for(
int i = index[start]
; i <= index[start + max_current -1]
; i++
) cout << endl;
}//system("pause");
return0;
}
最長回文子字串演算法
def is palindrome s if len s 1 return true else return s 0 s 1 and is palindrome s 1 1 眾所周知,寫遞迴的函式,需要 1 個基本情況,作為終止。還需要 1 個遞迴情況。關於回文字串的判斷,基本情況是,為 1 個字元...
問題 A 字串 最長回文子串
輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同。如abba和yyxyy。在判斷回文時,應該忽略所有標點符號和空格,且忽略大小寫,但輸出應保持原樣 在回文串的首部和尾部不要輸出多餘字元 輸入字串長度不超過5000,且佔據單獨的一行。應該...
字串 最長回文子串
最長回文子串 回文子串 即正著看和倒著看相同的子串,如 abcba yyxyy。由於此類題目為面試筆試常考題目,所以現在就來整理一下啦。1 暴力求解法 最直接的想法就是暴力求解,但是我們可以看到下面的 時間複雜度是o n 3 string findlongeststring string str 暴...