本文共 1812 字,大约阅读时间需要 6 分钟。
You are given a string s
containing lowercase letters and an integer k
. You need to :
s
to other lowercase English letters.s
into k
non-empty disjoint substrings such that each substring is palindrome.Return the minimal number of characters that you need to change to divide the string.
Example 1:
Input: s = "abc", k = 2Output: 1Explanation: You can split the string into "ab" and "c", and change 1 character in "ab" to make it palindrome.
Example 2:
Input: s = "aabbc", k = 3Output: 0Explanation: You can split the string into "aa", "bb" and "c", all of them are palindrome.
Example 3:
Input: s = "leetcode", k = 8Output: 0
Constraints:
1 <= k <= s.length <= 100
.s
only contains lowercase English letters.Accepted
4,625
Submissions
8,039
---------------------------------------------------------------------------------------------------------------
时间复杂度是O(N^2*k),k是题目中的参数,很难优化下去了。各种边界条件是这个题目的难点:
class Solution: def palindromePartition(self, s, k): l = len(s) cost = [[0 for i in range(l)] for j in range(l)] # dp = [[l for j in range(k + 2)] for i in range(l)] #[0..i]的字符串分j次最少是多少,i是最后一个元素 for span in range(2, l + 1): for i in range(0, l + 1 - span): start, end = i, i + span - 1 same = 0 if s[start] == s[end] else 1 cost[start][end] = cost[start + 1][end - 1] + same for i in range(l): dp[i][1] = cost[0][i] for j in range(2, min(i + 2, k + 2)): #bug1: min(i+1,k+1) for i0 in range(0, i): dp[i][j] = min(dp[i0][j - 1] + cost[i0 + 1][i], dp[i][j]) return dp[l - 1][k]s = Solution()print(s.palindromePartition("abc",2))print(s.palindromePartition("aabbc",3))print(s.palindromePartition("leetcode",8))
转载地址:http://ctfoi.baihongyu.com/