最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
参考博客:最长回文子串
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
length = len(s)
maxlen = 0
start = 0
#### 子串长度为奇数的情况
for i in range(length):
j = i - 1
k = i + 1
while j >= 0 and k < length and s[j] == s[k]:
if (k - j + 1) > maxlen:
maxlen = k - j +1
start = j
j -= 1
k += 1
#### 子串长度为偶数的情况
for i in range(length):
j = i
k = i + 1
while j >= 0 and k < length and s[j] == s[k]:
if k - j +1 > maxlen:
maxlen = k - j + 1
start = j
j -= 1
k += 1
if maxlen > 0:
return s[start: start + maxlen]
return s[0]
334. 递增的三元子序列
给定一个未排序的数组,请判断这个数组中是否存在长度为3的递增的子序列。
正式的数学表达如下:
如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。
要求算法时间复杂度为O(n),空间复杂度为O(1) 。
示例:
输入 [1, 2, 3, 4, 5]
,
输出 true
.
输入 [5, 4, 3, 2, 1]
,
输出 false
.
思路:参考递增的三元子序列
class Solution(object):
def increasingTriplet(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
if len(nums) < 3:
return False
major = nums[0]
stack = [major]
stack2 = []
for x in nums[1:]:
if x > major:
if stack2:
if x > stack2[-1]:
return True
if x > stack[-1]:
stack.append(x)
else:
if len(stack) == 2:
if stack2:
if x < stack2:
stack2 = stack[:]
else:
stack2 = stack[:]
stack = [major]
stack.append(x)
elif x < major:
major = x
if len(stack) == 2:
if stack2:
if x < stack2:
stack2 = stack[:]
else:
stack2 = stack[:]
stack = [x]
# print stack
if len(stack) >= 3:
return True
return False