程式設計之美 回文字元序列

2022-07-29 06:06:09 字數 1211 閱讀 9092

時間限制:2000ms

單點時限:1000ms

記憶體限制:256mb

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

第一行乙個整數t,表示資料組數。之後是t組資料,每組資料為一行字串。

對於每組資料輸出一行,格式為"case #x: y",x代表資料編號(從1開始),y為答案。答案對100007取模。

1 ≤ t ≤ 30

小資料字串長度 ≤ 25

大資料字串長度 ≤ 1000

樣例輸入

5

abaabcbaddabcba

12111112351121

ccccccc

fdadfa

樣例輸出

case #1: 5

case #2: 277

case #3: 1333

case #4: 127

case #5: 17

初步想法是動態規劃,用dp[i][j]表示s[i...j]之間的回文子串行的個數。

考慮dp[i][j]和dp[i][j - 1]的情況,dp[i][j]肯定包含dp[i][j - 1]的所有回文子串行。並且,當s[j]與s[i..j - 1]中的某個字元相同時,則會產生新的回文序列。

因此 dp[i][j] = dp[i][j - 1] + dp[k][j - 1] + 1, 其中s[k] == s[j - 1]。

考慮到需要遍歷i, j, k三個下表,時間複雜度是o(n3),顯然會超時。

參考其他人的題解,若s[j]與s[i + 1...j - 1]中的某個字元相同而產生的新的回文序列其實是已經包含在dp[i + 1][j]中,因此沒有必要重複求解。

如果s[j] != s[i],那麼dp[j][i] = dp[j][i - 1] + dp[j + 1][i] - dp[j + 1][i - 1]。此時回文序列分為三類,即包含s[j]的,包含s[i]的,以及都不包含的,根據集合原理可以得出解。

如果s[j] == s[i],此時dp[j][i] = dp[j][i - 1] + dp[j + 1][i] - dp[j + 1][i - 1] + dp[j + 1][i - 1] + 1,最後兩項表示以s[i]和s[j]為兩端組成的新的回文序列。

此時複雜度降為o(n2)

2015程式設計之美 回文字元序列 區間Dp

給定字串,求它的回文子串行個數。回文子串行反轉字元順序後仍然與原序列相同。例如字串aba中,回文子串行為 a a aa b aba 共5個。內容相同位置不同的子串行算不同的子串行。第一行乙個整數t,表示資料組數。之後是t組資料,每組資料為一行字串。對於每組資料輸出一行,格式為 case x y x代...

程式設計之美挑戰賽 回文字元序列(區間dp)

給定字串,求它的回文子串行個數。回文子串行反轉字元順序後仍然與原序列相同。例如字串aba中,回文子串行為 a a aa b aba 共5個。內容相同位置不同的子串行算不同的子串行。第一行乙個整數t,表示資料組數。之後是t組資料,每組資料為一行字串。對於每組資料輸出一行,格式為 case x y x代...

程式設計之美回文字串,DP

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定字串,求它的回文子串行個數。回文子串行反轉字元順序後仍然與原序列相同。例如字串aba中,回文子串行為 a a aa b aba 共5個。內容相同位置不同的子串行算不同的子串行。第一行乙個整數t,表示資料組數。之後是t組資料,...