回文串劃分(動態規劃)

2021-08-08 02:22:30 字數 985 閱讀 6190

題目描述

給出乙個字串 s,對這個字串進行切分,每個子串都必須是乙個回文字串,問最少要切多少次。

example:

給出 s = 「aab」,返回最少切分次數 1。因為只需要一次切分就能把 s 切分成符合要求的兩個子串[「aa」, 「b」] 。

暴力法:

列舉起點和終點去求該區間字串的最長回文字串(時間複雜度o(n^2)),找到後就去遞迴剩下的字串(時間複雜度o(n)),所以總的時間複雜度為o(n^3);

動態規劃法

定義dp[i]為前i個字元劃分成回文串的最小劃分次數,然後就會有dp[i] = min(dp[i], dp[j - 1] + 1)(j的取值:1~i)

**如下:

#include #include #include #include using namespace std;

#define maxn 256

bool ispalindrome[maxn][maxn];

int dp[maxn];//dp[i]代表前i個字元劃分成回文串的最小劃分次數

void initpalindromearray(string str)//把str中的回文串都標記起來;ispalindrome[i][j]代表字串的第i~j的字串是回文串

for (int i = 1; i < len; i++)

} }}

int main()

for (int i = 1; i <= len; i++)

else

}} }

printf("%d\n", dp[len]);

return 0;

}

動態規劃 劃分為回文串

題意 輸入乙個字串,問最少可以將它劃分成多少個回文串。思路 可以設定dp i 為從第乙個字元到第i個字元之間最少可以劃分的回文串,然後設1 j i,如果s j 1 s i 是回文串那麼dp i min dp j 1 o n的三次方 寫法,20ms include include include in...

最長回文串 動態規劃)

半對 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 思路一 翻轉字串法。1.將整個字串反轉,然後判斷原始的字串是否在反轉的字串 現。2.只是出現還不...

動態規劃 最長回文字串

題目 請從乙個已知的字串中尋找最長回文字串 解法1 動態規劃 回文字串的子串也是回文,比如p i,j 表示以i開始以j結束的子串 是回文字串,那麼p i 1,j 1 也是回文字串。這樣最長回文子串就能分解成一系列子問題了。這樣需要額外的空間o n 2 演算法複雜度也是o n 2 狀態方程和轉移方程 ...