91. 解码方法-数字-字母


DFS
class Solution:def numDecodings(self, s: str) -> int:def dfs(i):if i>=len(s):return 1ans=0if i+2<=len(s):num=int(s[i:i+2])if num>=10 and num<=26:ans+=dfs(i+2)if s[i]!='0':# print(ans)ans+=dfs(i+1)return ansif len(s)==0 or s[0]=="0":return 0else:return dfs(0)
DP
class Solution:def numDecodings(self, s: str) -> int:n = len(s)s = ' ' + sf = [0] * (n + 1)f[0] = 1for i in range(1,n + 1):a = ord(s[i]) - ord('0')b = ( ord(s[i - 1]) - ord('0') ) * 10 + ord(s[i]) - ord('0')if 1 <= a <= 9:f[i] = f[i - 1]if 10 <= b <= 26:f[i] += f[i - 2]return f[n]

class Solution:def numDecodings(self, s: str) -> int:n = len(s)s = ' ' + sf = [0] * 3f[0] = 1for i in range(1,n + 1):f[i % 3] = 0a = ord(s[i]) - ord('0')b = ( ord(s[i - 1]) - ord('0') ) * 10 + ord(s[i]) - ord('0')if 1 <= a <= 9:f[i % 3] = f[(i - 1) % 3]if 10 <= b <= 26:f[i % 3] += f[(i - 2) % 3]return f[n % 3]
剑指 Offer 14- I. 剪绳子
(1)DFS超时
class Solution:def cuttingRope(self, n: int) -> int:def dfs(chengji,changdu):if changdu==n:ans.append(chengji)if changdu<n:for j in range(1,n):dfs(chengji*j,changdu+j)ans=[]dfs(1,0)# print(ans)return max(ans)
(2)动态规划

class Solution:def cuttingRope(self, n: int) -> int:dp = [0] * (n + 1)dp[2] = 1for i in range(3, n + 1):for j in range(2, 4):dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))return dp[n]

Python 代码(第三栏): 由于语言特性,理论上 Python 中的变量取值范围由系统内存大小决定(无限大),因此在 Python 中其实不用考虑大数越界问题。
打家劫舍问题
1、相邻不能偷 198


大佬的解
class Solution:def rob(self, nums: List[int]) -> int:cur, pre = 0, 0for num in nums:cur, pre = max(pre + num, cur), curreturn cur
自己的解
class Solution:def rob(self, nums: List[int]) -> int:dp = [0]*len(nums)if len(nums)<=2:return max(nums)dp[0]=nums[0]dp[1]=max(nums[0],nums[1]) # 注意for i in range(2,len(nums)):dp[i]=max(dp[i-1],dp[i-2]+nums[i])return dp[-1]
2、头尾不能一起偷 213

class Solution:def rob(self, nums: [int]) -> int:def my_rob(nums):cur, pre = 0, 0for num in nums:cur, pre = max(pre + num, cur), curreturn curreturn max(my_rob(nums[:-1]),my_rob(nums[1:])) if len(nums) != 1 else nums[0]
×3、树形DP
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution:def rob(self, root: TreeNode) -> int:def _rob(root):if not root: return 0, 0 # 偷,不偷left = _rob(root.left)right = _rob(root.right)# 偷当前节点, 则左右子树都不能偷v1 = root.val + left[1] + right[1]# 不偷当前节点, 则取左右子树中最大的值v2 = max(left) + max(right)return v1, v2return max(_rob(root))
