712. 两个字符串的最小ASCII删除和
dp[i][j]代表s1[:i]和s2[:j]的最小删除和
s1和s2的长度为m和n,dp的行列数需要额外加一(dp[m+1][n+1]),用于表示s1或者s2为空的情况。在创建DP后先填充0行和0列,因为另一个字符(假设是s1)为空,所以当前位置的删除和为s2[:j]的所有字符的总和
随后开始遍历dp,如果遇到的字符相等,那么当前的删除和为去掉s[i-1]和s[j-1]的删除和,即dp[i][j] = dp[i - 1][j - 1]
如果遇到的字符不等,那么可以选择删去s1或者s2的其中一个,选择删除和更小的那个,即dp[i][j] = min(dp[i - 1][j] + ord(s1[i - 1]), dp[i][j - 1] + ord(s2[j - 1]))
class Solution:
def minimumDeleteSum(self, s1: str, s2: str) -> int:
m, n = len(s1), len(s2)
dp = [[0]*(n+1) for _ in range(m+1)]
# base case 填充第0行和第0列
for i in range(1, n+1):
dp[0][i] = dp[0][i-1] + ord(s2[i-1])
for i in range(1, m+1):
dp[i][0] = dp[i-1][0] + ord(s1[i-1])
for i in range(1, m+1):
for j in range(1, n+1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
# 不相等时,需要删去s1的或者s2的其中一个,选择删除和更小的那个
dp[i][j] = min(dp[i-1][j]+ord(s1[i-1]), dp[i][j-1]+ord(s2[j-1]))
return dp[-1][-1]
344. 反转字符串
解法:双指针
初始化两个指针left和right,分别指向数组开头和数组尾端,依次交换两个指针对应元素,每次交换后left指针右移一位,right指针左移一位,直至left == right则结束交换.
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left, right = 0, len(s)-1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1