今天在刷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]