Skip to content

Commit 6ff6ba8

Browse files
committed
review Palindrome
1 parent 1aaad92 commit 6ff6ba8

File tree

3 files changed

+69
-3
lines changed

3 files changed

+69
-3
lines changed

214-最短回文串.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
2-
3-
// 示例 1:
2+
//
3+
// 示例 1:
44
// 输入: "aacecaaa"
55
// 输出: "aaacecaaa"
6-
6+
//
77
// 示例 2:
88
// 输入: "abcd"
99
// 输出: "dcbabcd"

214. 最短回文串.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
2+
#
3+
# 示例 1:
4+
# 输入: "aacecaaa"
5+
# 输出: "aaacecaaa"
6+
#
7+
# 示例 2:
8+
# 输入: "abcd"
9+
# 输出: "dcbabcd"
10+
11+
class Solution:
12+
def shortestPalindrome(self, s: str) -> str:
13+
def preprocess(s: str) -> str:
14+
if not s:
15+
return "^$"
16+
T = ['^']
17+
for c in s:
18+
T.append('#')
19+
T.append(c)
20+
T.append("#$")
21+
return "".join(T)
22+
23+
T = preprocess(s)
24+
P = [0] * len(T)
25+
C, R = 0, 0
26+
for i in range(1, len(T) - 1):
27+
i_mirror = 2 * C - i
28+
P[i] = min(R - i, P[i_mirror]) if R > i else 0
29+
while T[i + P[i] + 1] == T[i - P[i] - 1]:
30+
P[i] += 1
31+
if i + P[i] > R:
32+
C, R = i, i + P[i]
33+
34+
end = 0
35+
for i, r in enumerate(P):
36+
if i - 1 == r:
37+
end = max(end, (i - r) // 2 + r - 1)
38+
return s[-1:end:-1] + s

42. 接雨水.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
2+
#
3+
# 示例 1:
4+
# 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
5+
# 输出:6
6+
# 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
7+
#
8+
# 示例 2:
9+
# 输入:height = [4,2,0,3,2,5]
10+
# 输出:9
11+
#
12+
# 提示:
13+
# n == height.length
14+
# 0 <= n <= 3 * 104
15+
# 0 <= height[i] <= 105
16+
17+
class Solution:
18+
def trap(self, height: List[int]) -> int:
19+
ans = 0
20+
stack = []
21+
for i in range(len(height) - 1, -1, -1):
22+
while stack and height[stack[-1]] < height[i]:
23+
h0 = height[stack.pop()]
24+
if stack:
25+
h1 = min(height[i], height[stack[-1]])
26+
ans += (h1 - h0) * (stack[-1] - i - 1)
27+
stack.append(i)
28+
return ans

0 commit comments

Comments
 (0)