题目:给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
输入: "babad",输出: "bab",注意: "aba" 也是一个有效答案。
来源:
法一: 自己的代码:
代码需要改进,实测中有得超时,无法通过.
思路:利用for循环进行遍历所有的字符串,从外到内,即滑窗从大到小进行遍历,一旦遇到了回文字符串,返回该串,
利用exit()立即终止程序,
注意:滑窗是奇数和偶数时稍有不同,特别是为1的时候,无法用该方法判断只能用if单独判断
# 暴力解法:# 思路:利用for循环进行遍历所有的字符串,从外到内,即滑窗从大到小进行遍历,一旦遇到了回文字符串,返回该串,# 利用exit()立即终止程序,# 注意:1 滑窗是奇数和偶数时稍有不同,特别是为1的时候,无法用该方法判断只能用if单独判断# 总结:下次写代码,不要首先就考虑暴力解法,要先考虑哪种算法运行时间最短,不要直接进行求解class Solution: def longestPalindrome(self, s): if len(s) in [ 0, 1]: return s else: for i in range(len(s)): # i 为滑窗补集的长度 也是滑窗要移动的次数 # print(i) start = 0 end = len(s) - i # 因为i是从0开始,所以必须要加1才能实现第一次的滑窗运算,否则会直接跳过,因为range(0)不执行 for j in range( i + 1): # j 记录滑窗第几次移动 # print('j is', j) # print('i is:', i) mark = 1 # 标记为1,即先假设它是回文字符串 # print('lklk',end) sliding_window_length = len(s) - i if sliding_window_length == 1: return s[0] exit() else: # print(sliding_window_length) for sliding_window_index in range(int(sliding_window_length / 2)): sliding_window = s[start:end] # print('sliding_window is ', sliding_window) # print('sliding_window length is ', len(sliding_window)) # print(sliding_window[sliding_window_index]) # print(sliding_window_length - 1 - sliding_window_index) # print(sliding_window[sliding_window_length - 1 - sliding_window_index]) # print(sliding_window) if sliding_window[sliding_window_index] == sliding_window[sliding_window_length - 1 - sliding_window_index]: pass else: mark = 0 break if mark == 1: # 说明该滑窗字符串符合回文字符串,终止for循环、 return sliding_window exit() start = start + 1 end = end + 1if __name__ == '__main__': # s = 'abcdcbadgghhhhhhhhhhhhhhhhhhhhhhh' print(len(s)) duixiang = Solution() # 先用类new出一个对象,再用对象调用类的方法 print(duixiang.longestPalindrome(s))