2019年8月19日——leetcode

本文介绍了三道LeetCode的编程题目,包括如何生成所有可能的满二叉树,求解最长有效括号的解决方案,以及找出字符串中无重复字符的最长子串的方法。链接提供了详细题目描述和解答思路。

894.所有可能的满二叉树

https://leetcode-cn.com/problems/all-possible-full-binary-trees/

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    memo = {0: [],1:[TreeNode(0)]}
    
    def allPossibleFBT(self, N: int) -> List[TreeNode]:
        if N not in Solution.memo:
            ans = []
            for x in range(N):
                y = N - 1 -x
                for left in self.allPossibleFBT(x):
                    for right in self.allPossibleFBT(y):
                        bns = TreeNode(0)
                        bns.left = left
                        bns.right = right
                        ans.append(bns)
            Solution.memo[N]=ans
        return Solution.memo[N]

32.最长有效括号

https://leetcode-cn.com/problems/longest-valid-parentheses/

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        ans = 0
        dp = [0] * len(s)
        for i in range(1,len(s)):
            if s[i] == ")":
                if s[i-1] == "(":
                    dp[i] = (dp[i-2] if i >= 2 else 0) + 2
                elif i -  dp[i-1] > 0 and s[i-dp[i-1]-1] == "(":
                    dp[i] = dp[i-1] + (dp[i - dp[i-1] - 2] if i - dp[i-1] >= 2 else 0) + 2
                ans = max(ans,dp[i])
                
        return ans

3.无重复的最长子串

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        ans = 0
        i = 0   # 第一个指针
        char_dict = {}
        for j in range(len(s)):
            if s[j] in char_dict.keys():
                i = max(char_dict[s[j]],i)
            ans = max(ans, j- i + 1)
            char_dict[s[j]] = j+1
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值