classSolution: deflengthOfLongestSubstring(self, s: str) -> int: d,start,max_l = {},-1,0 for i inrange(len(s)): if s[i] in d and d[s[i]]>start: start = d[s[i]] d[s[i]] = i else: d[s[i]]=i max_l = max(max_l,i-start) return max_l
classSolution: deflongestPalindrome(self, s: str) -> str: n = len(s) maxlen = 0 begin = 0 if n < 2or s == s[::-1]: return s for i inrange(1, n): a = s[i-maxlen-1:i+1] b = s[i-maxlen:i+1] if i-maxlen-1 >= 0and a == a[::-1]: #增加2的情况 begin = i-maxlen-1 maxlen += 2 continue if b == b[::-1]: #增加1的情况 begin = i-maxlen maxlen += 1 return s[begin:begin+maxlen]
15.三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 找出所有满足条件且不重复的三元组。
classSolution: deffourSum(self, nums: List[int], target: int) -> List[List[int]]: length = len(nums) if length<4: return [] res = [] nums.sort() for i inrange(length-3): if i>0and nums[i-1]==nums[i]: continue ifsum(nums[i:i+4])>target: #min break ifsum(nums[-3:])+nums[i]<target: #max continue for j inrange(i+1,length-2): if j>i+1and nums[j-1]==nums[j]: continue if nums[i]+sum(nums[j:j+3])>target: #min break if nums[i]+nums[j]+nums[-2]+nums[-1]<target: #max continue k,l = j+1,length-1 while k<l: tmp = nums[i]+nums[j]+nums[k]+nums[l] if tmp==target: res.append([nums[i],nums[j],nums[k],nums[l]]) k=k+1 while k<l and nums[k]==nums[k-1]: k+=1 l=l-1 while k<l and nums[l]==nums[l+1]: l-=1 elif tmp<target: k+=1 elif tmp>target: l-=1 return res
classSolution: defremoveNthFromEnd(self, head: ListNode, n: int) -> ListNode: s = ListNode(0) #新建一个伪头,用来防止特殊情况 s.next = head p,q = s,s for _ inrange(n): q = q.next#使得两个指针的距离为n while q.next: p,q = p.next,q.next p.next = p.next.next return s.next
注:使用双指针保持固定距离来获得倒数第n个的位置。同时添加伪头来确保特殊情况能成立。
22.括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
回溯法
1 2 3 4 5 6 7 8 9 10 11 12
classSolution: defgenerateParenthesis(self, n: int) -> List[str]: l = [] defback(s,left,right): if left+right==2*n: l.append(s) if left<n: back(s+"(",left+1,right) if left>right: back(s+")",left,right+1) back("",0,0) return l
classSolution: defcombinationSum(self, candidates: List[int], target: int) -> List[List[int]]: ifnot candidates: return [] n = len(candidates) res = [] candidates.sort()
defhelper(i,tmp,target): #i用于索引所有数组元素 if target == 0: res.append(tmp) return if i == n or candidates[i]>target: return helper(i,tmp+[candidates[i]],target-candidates[i]) helper(i+1,tmp,target) helper(0,[],target) return res
注:从小到大依次计算,每次扩展两种,这样可做到不重复计数。
179.最大数
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
实例:
1 2
输入: [10,2] 输出: 210
1 2 3 4 5 6 7 8
classlarger(str): def__lt__(x,y): return x+y>y+x
classSolution: deflargestNumber(self, nums: List[int]) -> str: largest = "".join(sorted(map(str,nums),key = larger)) return'0'if largest[0]=='0'else largest
classNumMatrix: def__init__(self, matrix: List[List[int]]): m, n = len(matrix), (len(matrix[0]) if matrix else0) self.mat = [[0for _ inrange(n+1)]for _ inrange(m+1)] for i inrange(m): for j inrange(n): self.mat[i+1][j+1] = self.mat[i+1][j]+self.mat[i][j+1]-self.mat[i][j]+matrix[i][j]
输入:s = "ababbc", k = 2 输出:5 解释:最长子串为"ababb",其中'a'重复了2次,'b'重复了3次。
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: deflongestSubstring(self, s: str, k: int) -> int: stack = [s] ans = 0 while stack: cur = stack.pop() for c inset(cur): if cur.count(c) < k: stack.extend([t for t in cur.split(c)]) break else: ans = max(ans, len(cur)) return ans
classSolution: defnumberOfArithmeticSlices(self, A: List[int]) -> int: length = len(A) if length<3: return0 cur,res=0,0 for i inrange(length-2): if A[i+1]-A[i]==A[i+2]-A[i+1]: cur+=1 res+=cur else: cur=0 return res
classSolution: defcharacterReplacement(self, s: str, k: int) -> int: num = [0] * 26 n = len(s) maxn = left = right = 0 while right < n: num[ord(s[right]) - ord("A")] += 1 maxn = max(maxn, num[ord(s[right]) - ord("A")]) if right - left + 1 - maxn > k: num[ord(s[left]) - ord("A")] -= 1 left += 1 right += 1 return right - left
classSolution: defnextGreaterElements(self, nums: List[int]) -> List[int]: N = len(nums) res = [-1] * N stack = [] for i inrange(N * 2): while stack and nums[stack[-1]] < nums[i % N]: res[stack.pop()] = nums[i % N] stack.append(i % N) return res
classSolution: defvalidateStackSequences(self, pushed: List[int], popped: List[int]) -> bool: cnt,stack,length=0,[],len(popped) for i in pushed: stack.append(i) while stack and popped[cnt]==stack[-1]: stack.pop() cnt+=1 return cnt==length
classSolution: defrotate(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ n = len(matrix) for i inrange((n+1)//2): for j inrange(n//2): matrix[i][j],matrix[j][n-i-1],matrix[n-i-1][n-j-1],matrix[n-j-1][i] = matrix[n-j-1][i],matrix[i][j],matrix[j][n-i-1],matrix[n-i-1][n-j-1]