// 暴力破解
// 例如:abcddcb
// 1.其子串為
// ab
// abc
// abcd
// abcdd
// abcddc
// abcddcb
// bc
// bcd
// bcdd
// bcddc
// bcddcb
// cd
// cdd
// ......
// 2.一一判斷所有的這些子串是否是回文串
// o(n3)
void longest(char * str)
int n = strlen(str);
if (n <= 1)
int start = 0, end = 0, max = 0,l = 0; // 最長子串起始點、終點、長度
for (int i = 0; i < n; i++) // 求出字串的每乙個子串,然後判斷其是否是最長子串
break;
}// 判斷當前子串是否為最長
if (l > max)}}
cout << start << "\t"
<< end << endl;
cout << "------------------------"
<< endl;
for (int i = start; i <= end; i++)
}
// 時間複雜度o(n^2),空間o(1)
// 依次掃瞄字串 以每個字元為中心 查詢其最長的回文子串 其中要考慮奇數偶數的問題
void longeststr(char * str)
// 奇數的情況 如bab
while (l >= 0 && r <= n - 1 && *(str + r) == *(str + l))
tmpl = r - l + 1;
if (tmpl > max)
}cout << maxl << "\t"
<< maxr << endl;
cout << "------------------------"
<< endl;
for (int i = maxl; i <= maxr; i++)
}
刪除暴力解法中有很多重複的判斷。很容易想到動態規劃(dp),時間複雜度o(n^2),空間o(n^2)。
在dp演算法中,每次要遍歷一遍字串,同時要判斷子串是否是回文,這裡顯然是存在重複計算的。這給我們改進提供了可能。那麼該如何更好的判斷回文呢?我們設定p[i][j]
則,存在以下幾種情況
i==j時,p[i][j]=true
j==i+1時,p[i][j]=str[i]==str[i]
其他,p[i][j]=p[i+1][j-1]&&(str[i]==str[j])
這個p該如何構建呢?根據其狀態轉移的方程,p[i][j]所代表的字串,長度從1開始變化,逐漸到整個字串,是這樣的乙個構建的過程,所以外層迴圈應該是所要判斷的字串的長度,而內層迴圈為從每個字元開始對p[i][j]進行判斷賦值。
**如下:
// 動態規劃
void longeststrdp(char * str)
; // 狀態矩陣
// 初始化矩陣dp
dp[0][0] = true;
for (int i = 1; i < n; i++)
// 連著
for (int i = 0; i < n; i++)
}for (int len = 2; len < n; len++) // 枚舉子字串的長度}}
cout << startindex << "\t"
<< startindex + max - 1
<< endl;
cout << "------------------------"
<< endl;
for (int i = startindex; i <= startindex + max - 1; i++)
}
最長回文子串 最長回文子串行
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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...