您的问题似乎不完整,您是想询问如何将一个子串从某个字符串中提取出来,还是有其他关于子串的问题?请提供更详细的信息,这样我才能给出准确的回答。
摘要:子串 (1) 和为 k 的子数组(前缀和) """ 给你一个整数数组 nums 和一个整数 k,请你统计并返回该数组中和为 k 的子数组的个数 输入:nums =
子串
(1) 和为 k 的子数组(前缀和)
"""
给你一个整数数组 nums 和一个整数 k,请你统计并返回该数组中和为 k 的子数组的个数
输入:nums = [1,2,3], k = 3
输出:2
"""
res = 0
presums = collections.defaultdict(int)
presums[0] = 1
presum = 0
for num in nums:
presum += num
# 每个前缀和 presum-k 代表着一个和为 k 的子数组
res += presums[presum-k]
presums[presum] += 1
return res
(2) 滑动窗口最大值(优先队列)
"""
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧,返回滑动窗口中的最大值
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
"""
res = []
q = collections.deque()
for i, num in enumerate(nums):
# 维护 q 的单调性
while q and nums[q[-1]] <= num:
q.pop()
q.append(i)
if i-q[0] >= k:
q.popleft()
if i >= k-1:
res.append(nums[q[0]])
return res
(3) 最小覆盖子串
"""
给定两个字符串 s 和 t,长度分别是 m 和 n,返回 s 中的最短窗口子串,使得该子串包含 t 中的每一个字符(包括重复字符)。如果没有这样的子串,返回空字符串
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
"""
need = collections.Counter(t)
missing = len(t)
left = 0
start = 0
min_len = float('inf')
for right, char in enumerate(s):
if need[char] > 0:
missing -= 1
need[char] -= 1
while missing == 0:
if right-left+1 < min_len:
start = left
min_len = right-left+1
need[s[left]] += 1
if need[s[left]] > 0:
missing += 1
left += 1
return "" if min_len == float('inf') else s[start:start+min_len]
数组
(1) 最大子数组和
"""
给你一个整数数组 nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
"""
res = float('-inf')
pre_sums = float('-inf')
for num in nums:
pre_sums = max(pre_sums+num, num)
res = max(res, pre_sums)
return res
(2) 合并区间
"""
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
"""
intervals.sort(key=lambda p: p[0])
res = []
for p in intervals:
if res and res[-1][-1] >= p[0]:
res[-1][-1] = max(res[-1][-1], p[1])
else:
res.append(p)
return res
(3) 轮转数组
"""
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
"""
def reverse(i, j):
while i < j:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j -= 1
n = len(nums)
k %= n
reverse(0, n-1)
reverse(0, k-1)
reverse(k, n-1)
(4) 除了自身以外数组的乘积
"""
给你一个整数数组 nums,返回 数组 reswer ,其中 reswer[i] 等于 nums 中除了 nums[i] 之外其余各元素的乘积
"""
n = len(nums)
pre = [1] * n
suf = [1] * n
for i in range(1, n):
pre[i] = pre[i-1] * nums[i-1]
for i in range(n-2, -1, -1):
suf[i] = suf[i+1] * nums[i+1]
return [p*s for p, s in zip(pre, suf)]
(5) 缺失的第一个正数
"""
给你一个未排序的整数数组 nums,请你找出其中没有出现的最小的正整数。
输入:nums = [1,4,0]
输出:2
"""
for a in nums:
while 0 < a <= len(nums) and a != nums[a-1]:
nums[a-1], a = a, nums[a-1]
for i in range(len(nums)):
if i+1 != nums[i]:
return i+1
return len(nums)+1
(6) 排序问题
def quicksort(nums, left, right):
if left >= right:
return
pivot = random.randint(left, right)
nums[left], nums[pivot] = nums[pivot], nums[left]
pivot = left
i, j = left, right
while i < j:
while i < j and nums[j] >= nums[pivot]:
j -= 1
while i < j and nums[i] <= nums[pivot]:
i += 1
nums[i], nums[j] = nums[j], nums[i]
nums[pivot], nums[j] = nums[j], nums[pivot]
quicksort(nums, left, j-1)
quicksort(nums, j+1, right)
return
def mergesort(nums, left, right):
if left >= right:
return
mid = (left + right) // 2
mergesort(nums, left, mid)
mergesort(nums, mid + 1, right)
merge(nums, left, mid, right)
def merge(nums, left, mid, right):
temp = []
i = left
j = mid + 1
while i <= mid and j <= right:
if nums[i] <= nums[j]:
temp.append(nums[i])
i += 1
else:
temp.append(nums[j])
j += 1
while i <= mid:
temp.append(nums[i])
i += 1
while j <= right:
temp.append(nums[j])
j += 1
for k in range(len(temp)):
nums[left + k] = temp[k]
