3.无重复字符的最长子串
题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路(2条):
-
暴力破解
遍历字符串所有子串,再判断每个字串是否含有重复字符,然后返回最长的无重复字符的子串长度,这个的时间复杂度是O(n)*O(n2)=O(n3),空间复杂度O(m), 其时间复杂度明显没办法被人接受。
-
滑动窗口
滑动窗口在计算机中非常常见。该算法可以通过滑动将两重循环降低到单重循环,从而降低时间复杂度为O(n)。
针对某个给定的字符串,我们指定两个辅助指针,begin和end,开始的时候,begin和end都指向字符串中第一个字符,然后end向后移动。这个过程中,借助一个字典来存储end经过的字符串和它的位置。
每当end的值已存在在字典里时,就说明出现了重复字符。此时begin移到end后边,end重新开始计数。以此类推,循环完毕后,返回最大的长度数即可。
代码如下:
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: ''' 时间复杂度:O(n) 空间复杂度:O(m),m为给定字符串长度 ''' ans = 0 d = {} begin, end = 0, 0 n = len(s) while end < n: last = d.get(s[end]) d[s[end]] = end if last is not None: ans = max(ans, end - begin) begin = max(begin, last + 1) end += 1 ans = max(ans, end - begin) return ans
7. 整数反转
题目:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例1:
输入: 123
输出: 321
示例2:
输入: -123
输出: -321
示例3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路:
首先这个数字符号不确定,所以最好将符号和数字分开处理。
由于反转,所以我们需要提取它每个数字,将这些数字按照位数依次乘回来并累加,最后加上符号即可。
当然,由于题目规定了范围,所以我们需要对溢出的数字进行控制。
代码如下:
class Solution:
def reverse(self, x: int) -> int:
'''
时间复杂度O(n)
'''
if x == 0: #排除特殊情况
return 0
str_x = str(x) #将x转为字符串处理
x = ''
if str_x[0] == '-':
x += '-'
x += str_x[len(str_x)-1::-1].lstrip("0").rstrip("-") #这个切片是python特有,从后往前开始计算。同时对此字符串进行处理,去掉左边的0和右边的负号
x = int(x) #转回到数字
if -2**31<x<2**31-1:
return x
return 0