zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Centos 配置网易YUM源
    JDK 变量配置
    redis如何解决key冲突?
    大数据技术(1)流式计算与Storm
    20151211小问题
    返回顶部
    20151210小问题2
    20151210小问题
    20151209小问题
    前端程序员的自我修养
  • 原文地址:https://www.cnblogs.com/liyinggang/p/13461838.html
Copyright © 2011-2022 走看看