题一:3. 无重复字符的最长子串
链接
关键点
编程思路
Me:
- 错误思路:遇到重复后,跳到已储存的索引的下一个位置 错例:abbccad
力扣实战
思路一:官方思路1
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
#看完官方思路一后手撕代码
start = 0 #记录当前无重复子串的起点
maxlen =0 #记录最长无重复子串的长度
hash = {} #哈希表,key为值,val为索引,用于判断以当前start为起点的字符串有没有重复,如果有清空hash,换起点
for start in range(len(s)):
if len(s)-start+1<=maxlen: #剪枝操作,若起点太靠后,可以结束查询
break
for ind,val in enumerate(s[start:]): #
if val in hash.keys(): #若出现了重复,说明当前为起点的字符串出现了重复,需要换起点了
hash.clear()
break
else:
hash[val]=1
maxlen = max(maxlen,ind+1) #切片字符串的ind已经不是源字符串的索引,所以更新长度时需注意
return maxlen #aabbaacc abbccad
# 反思1:
思路二: 优化版,左右指针只往右移动
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 哈希集合,记录每个字符是否出现过
occ = set()
n = len(s)
# rk为右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rk, ans = -1, 0
for i in range(n): #i为左指针
if i != 0:
# 左指针向右移动一格,移除一个字符
occ.remove(s[i - 1])
while rk + 1 < n and s[rk + 1] not in occ: #abcabcbb
# 不断地移动右指针
occ.add(s[rk + 1]) #set用add函数加入
rk += 1
# 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1)
return ans
题二:22. 括号生成
链接
关键点
- 最关键的是只有一种括号,所以无效的情况只有两种:左右括号数量不一样;出现了)(,也就是先有了)
编程思路
Me:
- 菜
力扣实战
思路一:动态规划
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
#考虑在已知i-1组括号分布时。第i个括号的分组的分析
dp =[[]for i in range(n+1)] #dp[i]表示i组括号的所有有效组合,第0组有0个有效,所以
dp[0]=[""] #需要创建n+1个空括号来存放结果
for i in range(1,n+1): #处理第i组括号的情况
for p in range(i):
q = i-1-p
l1 = dp[p]
l2 = dp[q]
for a in l1:
for b in l2:
dp[i].append("({0}){1}".format(a,b))
return dp[n]
# 反思1:fotmat作为Python的的格式字符串函数,主要通过字符串中的花括号{},来识别替换字段,从而完成字符串的格式化。
"({0}){1}".format(a,b) 为 “(a)b”
思路二:其他思路不会