最長回文子串

2021-07-03 18:18:24 字數 2157 閱讀 2337

// 暴力破解

// 例如: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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...