2020-08-09
99. 恢复二叉搜索树
二叉搜索树有个性质就是终须遍历时肯定是升序排列。
1 2 5 4 3 可以看到如果乱序了,那么这两个乱序节点肯定是先大后小。对于第一个节点,它属于大的那个,对于第二个节点,它属于小的那个。
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution(object): def recoverTree(self, root): """ :type root: TreeNode :rtype: None Do not return anything, modify root in-place instead. """ self.node1 , self.node2 , self.pre = None,None,None def dfs(root): if root is None: return dfs(root.left) if self.pre and self.pre.val > root.val and self.node1 is None: self.node1 = self.pre if self.pre and self.pre.val > root.val and self.node1: self.node2 = root self.pre = root dfs(root.right) dfs(root) self.node1.val ,self.node2.val = self.node2.val, self.node1.val
题型总结之保存异或状态第一次出现的位置(适用于连续序列条件出现偶数次的情况)。
5485. 找出最长的超赞子字符串
题解: 如果状态 s 第一次出现的位置是 idx1 , 第二次出现的位置是 idx2 , 那么idx1~idx2中间这段每个字符出现的次数肯定是偶数次,那么这段肯定是可行的结果(偶数长度回文串)。还有一种情况是某个字符出现了奇数次造成了s在前面没有出现过,我们把这个字符去掉那么它也会变成状态 s (异或一次即可), 这样对应了回文串长度为奇数的情况。
class Solution(object): def longestAwesome(self, s): """ :type s: str :rtype: int """ d = {} d[0] = 0 nowstatus = 0 ans = 0 for idx, c in enumerate(s): idx+=1 nowstatus = nowstatus ^ 2**(ord(c)-48) #print(nowstatus) for j in range(10): maskstatus = nowstatus ^ 2**j if maskstatus in d: ans = max(ans, idx - d[maskstatus]) if nowstatus in d: ans = max(ans, idx - d[nowstatus]) else: d[nowstatus] = idx return ans
1371. 每个元音包含偶数次的最长子字符串
class Solution(object): def findTheLongestSubstring(self, s): """ :type s: str :rtype: int """ d = dict() d[0] = 0 nowstatus = 0 ans = 0 for idx, c in enumerate(s): idx+=1 if c in ['a','e','i','o','u']: nowstatus = nowstatus ^ 2**(ord(c)-97) if nowstatus in d: ans = max(ans , idx-d[nowstatus]) else: d[nowstatus] = idx return ans