LeetCode 132 Palindrome Partitioning II (C++, Python)
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 =
Return
"aab"
,Return
1
since the palindrome partitioning ["aa","b"]
could be produced using 1 cut.Solution C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Solution { public: int minCut(string s) { bool palin[s.length()][s.length()]; for (int i = s.length() - 1; i >= 0; --i) { for (int j = i; j < s.length(); ++j) { if ((s[i] == s[j]) && ((j - i < 3) || palin[i + 1][j - 1])) { palin[i][j] = true; } else { palin[i][j] = false; } } } vector<int> mincuts (s.length(), 0); for (int i = 1; i < s.length(); ++i) { if (palin[0][i]) { mincuts[i] = 0; } else { int tmp = i; for (int k = 0; k < i; ++k) { if (palin[k + 1][i]) tmp = min(tmp, 1 + mincuts[k]); } mincuts[i] = tmp; } } return mincuts.back(); } }; |
Solution Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Solution: # @param s, a string # @return an integer def minCut(self, s): row = [False] * len(s) palin = [] for _ in range(len(s)): palin.append(row[:]) for i in range(len(s) - 1, -1, -1): for j in range(i, len(s)): if s[i] == s[j] and ((j - i < 3) or palin[i + 1][j - 1]): palin[i][j] = True mincuts = [0] * len(s) for i in range(1, len(s)): if palin[0][i]: mincuts[i] = 0 else: tmp = i for k in range(0, i): if palin[k + 1][i]: tmp = min(tmp, 1 + mincuts[k]) mincuts[i] = tmp return mincuts[-1] |