leetCode-739-每日温度 -- 5最长回文子串

题目描述:

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

思路:

要求从前往后找第一次出现比当前值大的

求解时,从后往前遍历,设置一个栈,如果栈为空,直接放入,最终结果中存放0,如果栈不空,当前值比栈顶小,求当前值和栈顶的索引之差,然后将索引放入栈顶,如果当前值比栈顶大,循环输出栈顶元素(因为要找出现第一次比当前值大的地方),这时还要判断栈是否空,如果栈空,将当前值直接放入,否则求当前值和栈顶的索引之差,再把当前值放入栈中

 1 class Solution:
 2     def dailyTemperatures(self, T: List[int]) -> List[int]:
 3         stack = []
 4         res = []
 5         for i in range(len(T)-1,-1,-1):
 6             if not stack:
 7                 stack.append(i)
 8                 res.append(0)
 9             else:
10     
11                 while stack and T[i]>=T[stack[-1]] : # 先判断栈是否空,再取栈中的值,否则下标越界
12                     stack.pop()
13                 if not stack:
14                     res.append(0)
15                 else:
16                     res.append(stack[-1]-i)
17                 stack.append(i)
18         res.reverse() # 返回none
19         #return [res[i] for i in range(len(res)-1,-1,-1)]
20         return res

 最长回文子串

讲的很清楚:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/

 

 1 class Solution:
 2     def longestPalindrome(self, s: str) -> str:
 3         n = len(s)
 4         dp = [[False]*n for _ in range(n) ]
 5         ans = ''
 6         for terminal in range(n):# 间隔
 7             for begin in range(n):
 8                 end = begin+terminal
 9                 if end>=n:
10                     break
11                 if terminal==0:
12                     dp[begin][end] = True
13                 elif terminal==1:
14                     dp[begin][end] = (s[begin]==s[end])
15                 else:
16                     dp[begin][end] = (dp[begin+1][end-1] and s[begin]==s[end])
17                 if dp[begin][end] and terminal+1>len(ans):
18                     ans = s[begin:end+1]
19         return ans

 

 

 1 class Solution:
 2     def expandAroundCenter(self, s, left, right):
 3         while left >= 0 and right < len(s) and s[left] == s[right]:
 4             left -= 1
 5             right += 1
 6         return left + 1, right - 1
 7 
 8     def longestPalindrome(self, s: str) -> str:
 9         start, end = 0, 0
10         for i in range(len(s)):
11             left1, right1 = self.expandAroundCenter(s, i, i)
12             left2, right2 = self.expandAroundCenter(s, i, i + 1)
13             if right1 - left1 > end - start:
14                 start, end = left1, right1
15             if right2 - left2 > end - start:
16                 start, end = left2, right2
17         return s[start: end + 1]
18 
19 作者:LeetCode-Solution
20 链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/
21 来源:力扣(LeetCode)
22 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/shuangcao/p/13656981.html