今天在刷leetcode05的时候,对照着别人运行正常的代码,代码翻来覆去敲了N遍,逻辑捋了N遍,都是一致的,但结果就是不正确。根据结果倒推print出来了错误输出的地方,但还是搞不清为什么会出错。
最后完全复制了一遍,自己改一行,测一次。终于发现,确实不是逻辑问题,而是二维数组初始化的问题。
二维数组初始化的时候,赋值语句有问题。
我用的代码是:
1:dp = [[False]*size] *size
正确输出用的代码是:
2: dp = [[False for _ in range(size)] for _ in range(size)]
对比发现,1的语句无法正确赋值,而2可以:
比如:
size = 2
dp1 = [[False]*size] *size
dp2 = [[False for _ in range(size)] for _ in range(size)]
print(dp1)
print(dp2)
#两者此时的输出结果看起来一样: [[False, False], [False, False]]
dp1[0][1]=True
dp2[0][1]=True
print(dp1)
#dp1 输出为 [[False, True], [False, True]]
print(dp2)
#dp2 输出为 [[False, True], [False, False]]
可以看到for in range 方法生成的二维数组赋值结果是正确的,直接乘出来的数组,赋值时,不是期待的结果。
python中二维数组
查了一下,python中二维数组广泛使用的方法,除了上面的1,2之外就是使用numpy库的函数:
numpy是数值计算,在本题中,可以将false设为0 ,True设为1,其余代码可以不变:
import numpy as np
dp = np.zeros((size,size),dtype = int)
1. np. array函数:从常规Python列表或元组中创建数组。得到的数组的类型是从Python列表中元素的类型推导出来的。
2. np.zeros(),np.ones(),np.empty(): 数组的元素最初是未知的,但它的大小是已知的。使用0或1作为占位符——三者的入参格式相同:np.函数名((d1,d2,d3,...),dtype='元素类型')
程序整体代码如下,题目链接为:力扣 5:最长回文子串
# import numpy as np
class Solution:
def longestPalindrome(self, s: str) -> str:
length = len(s)
if length <2:
return s
dp = [[ False for _ in range(length)] for _ in range(length)]#正确
# dp =[[[False]*length]*length] #错误
# dp=np.zeros((length,length),dtype =int) #使用此行时,后续dp的赋值由True改为1#但是提示时“超出时间显示”,将报错的样例单个运行,结果正确,是包的调用导致的
max_len = 1
sp = 0
for winR in range(1,length):
for winL in range(winR):
if s[winL] == s[winR] and winR-winL <3:
dp[winL][winR] = True
if s[winL] == s[winR] and dp[winL+1][winR-1]:
dp[winL][winR] = True
if dp[winL][winR] and winR-winL+1 > max_len:
max_len = winR-winL+1
sp = winL
return s[sp:sp+max_len]