動態規劃 回文最少分割

2021-10-02 21:15:23 字數 739 閱讀 4236

題目描述

題目鏈結

給定乙個字串,返回把str全部切割成回文串的最少切割數。

輸出包含一行字串,長度1-5000

輸出乙個整數,代表把str全部切割成回文串的最小切割數。

aba本身是回文串,不需要切割,直接輸出0

abcbaeee

切割1次,變為「abcba」和「eee」

時間複雜度o(n^2)

)額外空間複雜度o(n^2)

用陣列dp[i]記錄從第0個字元開始到當前字元最少的分割數,用陣列isround[i][j]記錄第i個字元與第j個字元之間的字元是否是回文串。

從前向後遍歷dp[i],內迴圈j從後向前遍歷,尋找回文串,找到則進入設定isround[j][i]為回文,並且設定dp[i]的值,dp[i] = min,為什麼是dp[j-1]+1呢,因為如果dp[j][i]為回文串則說明從str[j]之後不用分割,而dp[j-1]記錄了前面j-1個字串的最少分割數,故從j-1之後處再切一刀即可。

至於為什麼要設定dp[-1]=-1,因為當整個字串都為回文串時,dp[j-1]+1正好可以為0

動態規劃思想體現在回文串的判斷上,當前的判斷依賴之前的判斷,可以迅速做出判斷。

#include

#include

using

namespace std;

intmain

(void)}

} cout<<}}

回文最少分割數

給定乙個字串str,返回把str全部切割為回文子串的最小分割數。該題可以使用動態規劃的思想來解決。首先要明確好dp i 的概念,即從str的首個位置開始到第i個位置要切割為回文子串的最小分割數。最後的dp str.length 1 就是題目的結果。要求出dp i 的值就需要遍歷陣列str 0 i 假...

回文最少分割數

題目 給定乙個字串str,返回把str全部切成回文子串的最小分割數。舉例str aba 本身是回文串,所以不需要切割,返回0。str acdcdcdad 最少需要切2次變成3個回文子串,比如 a cdcdc dad 返回2。解答經典動態規劃。定義動態規劃陣列dp,dp i 的含義是子串str 0 i...

回文最少分割數

給定乙個字串,返回把str全部切割成回文串的最少切割數。輸出包含一行字串,代表str 1 leq length leq 5000 1 lengthstr 5000 輸出乙個整數,代表把str全部切割成回文串的最小切割數。示例1 aba0本身是回文串,不需要切割,直接輸出0示例2 abcbaeee1切...