classSolution: deflengthOfLongestSubstring(self, s: str) -> int: occ = set() n = len(s) # rk为左指针,ans为无重复子串长度 rk, ans = -1, 0 flag = 0# 循环中无重复子串长度 for i inrange(n): rk = i flag = 0 while rk < n and s[rk] notin occ: occ.add(s[rk]) flag = flag + 1 rk = rk + 1 ans = flag if flag > ans else ans occ.clear() return ans
方法二:
每次循环没必要把集合里的元素全部删除,可以每次只删除上一轮循环的最左边结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: deflengthOfLongestSubstring(self, s: str) -> int: occ = set() n = len(s) # rk为左指针,ans为无重复子串长度 rk, ans = 0, 0 flag = 0# 循环中无重复子串长度 for i inrange(n): if i > 0: occ.remove(s[i - 1]) flag = flag - 1 while rk < n and s[rk] notin occ: occ.add(s[rk]) rk = rk + 1 flag = flag + 1 ans = flag if flag > ans else ans return ans
4、最长回文子串
本题使用的动态规划的思想,也就是说只有
s[i+1:j-1]s[i+1:j−1] 是回文串,并且
ss 的第 ii 和 jj
个字母相同时,s[i:j]s[i:j] 才会是回文串。
classSolution: defconvert(self, s: str, numRows: int) -> str: n = len(s) if numRows == 1or numRows >= n: return s t = 2 * numRows - 2 col = (n + t - 1) // t * (numRows - 1) matrix = [[''] * col for _ inrange(numRows)] x, y = 0, 0 for i, ch inenumerate(s): matrix[x][y] = ch if i % t < numRows - 1: x = x + 1 else: x = x - 1 y = y + 1 ans = '' for i inrange(numRows): for j inrange(col): if matrix[i][j]: ans = ans + matrix[i][j]
classSolution: defmyAtoi(self, s: str) -> int: flag = False if s == '': return0 for i, ch inenumerate(s): if ch != ' ': s = s[i:] break
if s[0] == '-': flag = True s = s[1:] elif s[0] == '+': s = s[1:] a = 0 ans = 0 for i, ch inenumerate(s): if ch.isdigit() == False: break a = int(ch) ans = ans * 10 + a if flag: ans = -1 * ans if ans > 2 ** 31 - 1: return2 ** 31 - 1 elif ans < -(2 ** 31): return -(2 ** 31) else: return ans
classSolution: deflongestCommonPrefix(self, strs: List[str]) -> str: flag = strs[0] # 前几个字符串的最长前缀 a = ""# 本字符串与flag的最长前缀 ans = "" n = len(strs) if n == 1: # 如果只有一个字符串,那就直接输出 return strs[0] for i, s inenumerate(strs): if i == 0: # 如果是第一个字符串那就跳过 continue for j, ch inenumerate(s): # 本字符串与flag进行比对 if j < len(flag) and ch == flag[j]: a = a + ch else: break flag = a a = "" if i == n - 1: # 如果是最后一个结点,那就是最终最长前缀了 ans = flag return ans
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next classSolution: defmergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: head = ListNode(0, None) temp = head first = list1 second = list2 while first and second: if first.val <= second.val: temp.next = first temp = temp.next first = first.next elif first.val > second.val: temp.next = second temp = temp.next second = second.next
temp.next = first if first else second
return head.next
22、括号生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: defgenerateParenthesis(self, n: int) -> List[str]: ans = [] defbacktrack(S, left, right): iflen(S) == 2 * n: ans.append(''.join(S)) return if left < n: S.append('(') backtrack(S, left + 1, right) S.pop() if right < left: S.append(')') backtrack(S, left, right + 1) S.pop() backtrack([], 0, 0) return ans