KMP算法复习
- 核心:创建最长相等前后缀列表
def getNext(self, needle):
j = 0
# 创建list
nextList=['' for i in range(len(needle))]
# 设第一个值为0
nextList[0] = 0
for i in range(1, len(needle)):
# 如果前后缀的最后一个字符不相等,则j(持续)向前跳
while j > 0 and needle[j] != needle[i]: # j指向前缀末尾位置,i指向后缀末尾位置
j = nextList[j - 1]
# 如果前后缀的最后一个字符相等,则j向后移动一位
if needle[i] == needle[j]:
j += 1
# 每次比较结束,前缀表都记录该位置的最长相等前后缀长度
nextList[i] = j
return nextList
前缀和技巧:
- self.preSum[i] = nums[i - 1] + self.preSum[i - 1]
- self.preSum[i][j] = matrix[i-1][j-1] + self.preSum[i-1][j] + self.preSum[i][j-1] - self.preSum[i-1][j-1]
- 一维
class NumArray(object):
def __init__(self, nums):
self.preSum = [0] * (len(nums) + 1)
for i in range(1, len(self.preSum)):
self.preSum[i] = nums[i - 1] + self.preSum[i - 1]
def sumRange(self, left, right):
return self.preSum[right + 1] - self.preSum[left]
- 二维
class NumMatrix(object):
def __init__(self, matrix):
self.m = len(matrix)+1
self.n = len(matrix[0])+1
if self.m == 0 or self.n == 0:
return
self.preSum = [[0 for i in range(self.n)] for j in range(self.m)]
for i in range(1, self.m):
for j in range(1, self.n):
# 计算每个矩阵 [0, 0, i, j] 的元素和
self.preSum[i][j] = matrix[i-1][j-1] + self.preSum[i-1][j] + self.preSum[i][j-1] - self.preSum[i-1][j-1]
def sumRegion(self, row1, col1, row2, col2):
return self.preSum[row2+1][col2+1] - self.preSum[row1][col2+1] - self.preSum[row2+1][col1] + self.preSum[row1][col1]