-
-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy path0132-palindrome-partitioning-ii.py
More file actions
69 lines (61 loc) · 2.31 KB
/
0132-palindrome-partitioning-ii.py
File metadata and controls
69 lines (61 loc) · 2.31 KB
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# time complexity: O(n^2)
# space complexity: O(n^2)
class Solution:
def minCut(self, s: str) -> int:
n = len(s)
cutsDP = [0 for _ in range(n)]
dp = [[False for _ in range(n)] for _ in range(n)]
for right in range(n):
for left in range(right + 1):
if s[left] == s[right] and (right - left <= 2 or dp[left + 1][right - 1]):
dp[left][right] = True
for right in range(len(s)):
minimumCut = right
for left in range(right + 1):
if dp[left][right]:
if left == 0:
minimumCut = 0
else:
minimumCut = min(minimumCut, cutsDP[left - 1] + 1)
cutsDP[right] = minimumCut
return cutsDP[len(s) - 1]
# time complexity: O(n^2 * n)
# space complexity: O(n^2)
class Solution:
def __init__(self):
self.memoCuts = []
self.memoPalindrome = []
def minCut(self, s: str) -> int:
self.memoCuts = [[None] * len(s) for _ in range(len(s))]
self.memoPalindrome = [[None] * len(s) for _ in range(len(s))]
return self.findMinimumCut(s, 0, len(s) - 1, len(s) - 1)
def findMinimumCut(self, s, start, end, minimumCut):
if start == end or self.isPalindrome(s, start, end):
return 0
if self.memoCuts[start][end] != None:
return self.memoCuts[start][end]
for currentEndIndex in range(start, end + 1):
if self.isPalindrome(s, start, currentEndIndex):
minimumCut = min(
minimumCut,
1
+ self.findMinimumCut(
s, currentEndIndex + 1, end, minimumCut
),
)
self.memoCuts[start][end] = minimumCut
return self.memoCuts[start][end]
def isPalindrome(self, s, start, end):
if start >= end:
return True
if self.memoPalindrome[start][end] != None:
return self.memoPalindrome[start][end]
self.memoPalindrome[start][end] = (
s[start] == s[end]) and self.isPalindrome(s, start + 1, end - 1)
return self.memoPalindrome[start][end]
s = "aab"
print(Solution().minCut(s))
s = "a"
print(Solution().minCut(s))
s = "ab"
print(Solution().minCut(s))