LeetCode每日两题————day2
LeetCode3.无重复字符的最长子串
题目详情
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
代码实现
class Solution:
def lengthOfLongestSubstring(self, oriStr: str) -> int:
arr = [0 for i in range(len(oriStr))]
for i in range(1, len(oriStr)):
start = 0
for j in range(i-1, -1, -1):
start = max(start, arr[j])
if oriStr[i] == oriStr[j]:
arr[i] = j + 1
break
if j == start:
arr[i] = start
break
maxLen = 0
maxIndex = 0
for i in range(len(oriStr)):
if i - arr[i] > maxLen:
maxLen = i - arr[i]
maxIndex = i
return len(oriStr[maxIndex-maxLen:maxIndex+1])
LeetCode5. 最长回文子串
题目详情
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
代码实现
方法一:暴力匹配
此方法与第三题思路相仿,但时间复杂度略高,提交时会出现超时情况。
class Solution:
def longestPalindrome(self, s: str) -> str:
huiwen_str = ''
len_huiwen = 0
if len(s) == 1:
return s
for i in range(len(s)):
for j in range(i, len(s)):
if s[i:j+1] == s[i:j+1][::-1]:
if j-i+1 >len_huiwen :
huiwen_str = s[i:j+1]
len_huiwen = j-i+1
return huiwen_str
方法二:中心扩散法
此方法思路为遍历每一个索引,以这个索引为中心,利用“回文串”中心对称的特点,往两边扩散,看最多能扩散多远。
class Solution:
def longestPalindrome(self, s):
if len(s) == 0:
return ''
# 至少是 1
longest_palindrome = 1
longest_palindrome_str = s[0]
for i in range(len(s)):
# 在该字符串是奇数的情况
palindrome_odd, odd_len = self.__center_spread(s, i, i)
# 在该字符串是偶数的情况
palindrome_even, even_len = self.__center_spread(s, i, i + 1)
# 当前找到的最长回文子串
cur_max_sub = palindrome_odd if odd_len >= even_len else palindrome_even
if len(cur_max_sub) > longest_palindrome:
longest_palindrome = len(cur_max_sub)
longest_palindrome_str = cur_max_sub
return longest_palindrome_str
def __center_spread(self, s, left, right):
"""
left = right 的时候,此时回文中心是一条线,回文串的长度是奇数
right = left + 1 的时候,此时回文中心是任意一个字符,回文串的长度是偶数
"""
l = left
r = right
while l >= 0 and r < len(s) and s[l] == s[r]:
l -= 1
r += 1
return s[l + 1:r], r - l - 1