Given a string s, partition s such that every substring of the partition is a palindrome.
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.
The problem can be transformed to the following: minimum[i:n] means the minimum cut we needed for substring s[i:n], and it could be the minimum of minimum[j+1:n]+1 for all i <= j < n.
C++ Code:
/* * func: min_cut * goal: find the minimum number of min_cut so that each partition is a palindrome * @param s: input string * return: minimum cut */ int min_cut(string s){ size_t str_length = s.length(); if(str_length == 0){ return 0; } //a 2D array which indicate if substring(i, j) is a palindrome vector<vector<bool> > palindrome(str_length, vector<bool>(str_length, false)); for(int i = 0; i < str_length; ++i){ //Check palindrome taking s[i] as symmetry axis int left = i; int right = i; while(left >= 0 && right < str_length && s[left] == s[right]){ palindrome[left][right] = true; --left; ++right; } //Check palindrome taking s[i] s[i+1] as symmetry axis left = i; right = i+1; while(left >= 0 && right < str_length && s[left] == s[right]){ palindrome[left][right] = true; --left; ++right; } } vector<int> minimum_cut(str_length, str_length); for(int i = 0; i < str_length; ++i){ if(palindrome[0][i]){ minimum_cut[i] = 0; }else{ int min_cut_now = str_length; for(int j = 1; j <= i; ++j){ if(palindrome[j][i] && min_cut_now > minimum_cut[j-1] + 1){ min_cut_now = minimum_cut[j-1] + 1; } } minimum_cut[i] = min_cut_now; } } return minimum_cut.back(); }
Python Code:
# func: find the minimum cut needed for a palindrome partitioning of string # @param s: input string # @return: minimum cut def min_cut(s): if not s: return 0 palindrome = [[False] * len(s) for _ in xrange(len(s))] minimum_cut = [len(s) - i for i in xrange(len(s)+1)] for i in xrange(len(s)-1, -1, -1): for j in xrange(i, len(s)): if s[i] == s[j] and (j-i < 2 or palindrome[i+1][j-1]): palindrome[i][j] = True minimum_cut[i] = min(minimum_cut[i], minimum_cut[j+1] + 1) return minimum_cut[0]-1
Reference Link:
1. 水中的鱼: [LeetCode] Palindrome Partitioning II, Solution: http://fisherlei.blogspot.com/2013/03/leetcode-palindrome-partitioning-ii.html
No comments:
Post a Comment