剑指 Offer 46. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
动态规划:
def translateNum(self, num: int) -> int:
dp = []
nums = str(num)
dp.append(1)
dp.append(1)
for i in range(2, len(nums)+1):
cons = 10*int(nums[i-2]) + int(nums[i-1])
if cons >= 10 and cons <= 25:
temp = dp[i-1] + dp[i-2]
dp.append(temp)
else:
temp = dp[i-1]
dp.append(temp)
return dp[-1]
看了大佬的思路写出来的,我之前犯错主要是dp的状态没有定义对,这里应该是dp是转化的可能数,我之前定义是可能的组合,非常麻烦,没写出来。下面是大佬的思路。
大佬代码:
class Solution:
def translateNum(self, num: int) -> int:
s = str(num)
a = b = 1
for i in range(2, len(s) + 1):
a, b = (a + b if "10" <= s[i - 2:i] <= "25" else a), a
return a
这里用了同时a, b赋值的方法,减少了代码量。
剑指 Offer 48. 最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
动态规划:
def lengthOfLongestSubstring(self, s: str) -> int:
if s == "": return 0
dp = []
dp.append(1)
mark = 0
for i in range(1, len(s)):
if s[i] not in s[mark:i]:
temp = dp[i-mark-1] + 1
dp.append(temp)
else:
mark = len(s[:i-1]) - s[i-1::-1].index(s[i]) -1 + 1
if mark == len(s)-1: break
temp = dp[i-1]
dp.append(temp)
return dp[-1]
只能过部分测试
下面是大佬的思路和代码:
大佬代码:
def lengthOfLongestSubstring(self, s: str) -> int:
temp = res = 0
dic = {}
for j in range(len(s)):
i = dic.get(s[j], -1)
dic[s[j]] = j
temp = temp + 1 if temp < j - i else j - i
res = max(res, temp)
return res