求最長回文串
列舉所有點兩兩組合
判斷兩點之內是否是回文
列舉的時間複雜度是o(n ^ 2),判斷的時間複雜度是o(n),所以暴力的方法時間複雜度為o(n ^ 3)
#include
#include
#include
using
namespace std;
intmain()
if(start >= end) temp = j - i +1;
if(temp > ans) ans = temp;}}
printf
("%d"
, ans)
;}
注
只有乙個字元的時候,也是回文結構且回文長度為1,所以ans要初始化為1。
動態規劃做法是找到狀態轉移方程。
令dp[i][j]來表示i,j之間的串是否為回文串,則如果str[i] == str[j] && dp[i + 1][j - 1] == 1,就能保證當前i,j的串也是回文結構。
一開始所有的dp[i][i]都是1,然後可既得的更新就是dp[i][i + 1],這是可以直接初始化處理得到的
然後針對不同的長度進行判斷,所以設定長度l作為外迴圈變數
設定了l,則內迴圈中判斷的子串長度是相同的,只是判斷他們是否為回文結構,這樣就可以使得長度4使用長度3的結論,使狀態可以順利轉移不漏判。
#include
#include
#include
#include
using
namespace std;
const
int maxn =
1010
;int dp[maxn]
[maxn]
;int
main()
}}for(
int l =
3; l <= str.
size()
; l++)}
}printf
("%d"
, ans)
;return0;
}
C程式 PAT 1040 有幾個PAT
現給定字串,問一共可以形成多少個pat?輸入只有一行,包含乙個字串,長度不超過10 5 只包含p a t三種字母。在一行中輸出給定字串中包含多少個pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。思路分析1 常規思路,從頭開始掃瞄字串,找到 p 然後就去找從此往後的 a 然後...
PAT 1040 有幾個PAT 25 分
現給定字串,問一共可以形成多少個 pat?輸入只有一行,包含乙個字串,長度不超過10 5,只包含 p a t 三種字母。在一行中輸出給定字串中包含多少個 pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。一開始打算用三層for迴圈暴力解題,但是一看到字串長度,遂放棄了這個想法...
PAT 1040 有幾個PAT 25分
現給定字串,問一共可以形成多少個 pat?輸入格式 輸入只有一行,包含乙個字串,長度不超過10 5 只包含 p a t 三種字母。輸出格式 在一行中輸出給定字串中包含多少個 pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。輸入樣例 輸出樣例 2題目分析 一開始很容易想到反覆...