字串回文子串行問題

2021-07-06 10:59:06 字數 1310 閱讀 9382

【問題1】求字串回文子串行的個數

問題:給定字串,求它的回文子串行個數。回文子串行反轉字元順序後仍然與原序列相同。例如字串aba中,回文子串行為」a」, 「a」, 「aa」, 「b」, 「aba」,共5個。內容相同位置不同的子串行算不同的子串行。

分析與解法:

(注意:與子串不同,子串行可以是不連續的,只要元素的前後相對位置不變。)

解法一:遞迴

假設s[0 … n-1]是給定的序列,長度為讓 c(0,n-1)表示序列s[0 … n-1] 的回文子串行的個數。

如果s的最後乙個元素和第乙個元素是相同的:c(1, n-1) + c(0, n-2) + 1。

如果s的最後乙個元素和第乙個元素是不同的,這時:c(0, n-1) = c(1, n-1) + c(0, n-2) - c(1, n-2) ,即」ab」+ 「ba」 - 「b」 。

可以寫出如下遞迴程式:

int

count(string str, int i, int j)//呼叫時count(str, 0, n-1);

解法二:動態規劃

解法一中存在重複計算的問題,且當字串長度過大時,遞迴的時間複雜度會很高。可以採用動態規劃的方法。

用dp[j][j+i]表示s[j…j+i]之間的回文子串行的個數,

如果s的最後乙個元素和第乙個元素是相同的:dp[j][j+i] = dp[j+1][j+i] + dp[j][j+i-1] + 1。

如果s的最後乙個元素和第乙個元素是不同的,這時:dp[j][j+i] = dp[j+1][j+i] + dp[j][j+i-1] - dp[j+1][j+i-1],即」ab」+ 「ba」 - 「b」。

這裡可以將二維陣列dp的值列出,方便理解。其中橙色區域的數值只與黃色區域的數值有關,以dp[0][1]為例,若首尾元素相同,則等於dp[1][1] + dp[0][0] + 1;若首尾元素不同,則等於dp[1][1] + dp[0][0] - dp[1][0]。

}//返回串 str[0][n-1] 的結果

return dp[0][n-1];

}【問題2】求字串回文子串行的最大長度

C 檢測字串回文子串和回文子串行

string 回文子串 回文子串行 狀態表示f i j 表示下標區間是 i,j 範圍內的不同的回文子串行個數 狀態轉移 如果s i s j f i j 2 f i 1 j 1 2 乘以2是內部的不同回文個數本身f i 1 j 1 和套上左右邊界兩個字元後的不同回文個數f i 1 j 1 加上2是邊界...

問題 A 字串 最長回文子串

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

字串 最長回文子串

最長回文子串 回文子串 即正著看和倒著看相同的子串,如 abcba yyxyy。由於此類題目為面試筆試常考題目,所以現在就來整理一下啦。1 暴力求解法 最直接的想法就是暴力求解,但是我們可以看到下面的 時間複雜度是o n 3 string findlongeststring string str 暴...