[LeetCode] Palindrome Partitioning II

Given a string s, partition s such that every substring of the partition is a palindrome.html

Return the minimum cuts needed for a palindrome partitioning of s.算法

For example, given s = "aab",
Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.函數

  給定一個字符串,返回最小回文分割次數。同上一題,此處也須要斷定字符串是不是迴文串,須要使用到DP算法來加速。code

  考慮問題的主體:最小次數。給定一個字符串s,設最小分割函數爲min_cut(),字符串s的最小分割串集合爲{s}。{s}會對應有幾個分割點,例如示例中的1cut,對應會有一個分割點。在這些分割點中任取一個點k,它會把s分割爲s1,s2兩個子串,同時也會把最小分割集合分紅兩部分{s1},{s2},則集合{s1}和{s2}必然也會是子串s1和s2的最小分割集合,且htm

  min_cut(s) = min_cut(s1) + min_cut(s2) + 1   (1)blog

證實能夠使用反證法,若是{s1}不是s1的最小分割集合,則必然存在一個最小分割集合{s1}',用它替換{s1}在{s}中的位置,能夠獲得更優的最小分割集合{s}’。這與{s}是最小分割集合相矛盾。能夠看出這是一個最有子結構問題,能夠考慮使用DP來求解。字符串

  綜上所述,這裏兩次使用了DP算法,一次是在判斷迴文串,另外一次是在找最小分割次數。get

代碼能夠參考:http://www.cppblog.com/wicbnu/archive/2013/03/18/198565.htmlstring

相關文章
相關標籤/搜索