0226leetcode刷题5道python

145

题目描述:
给定一个二叉树,返回它的后序遍历。

示例:
在这里插入图片描述
解答:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        res,st,r,prev=[],[],root,None

        while r or st:
            #  一直往左走
            while r:
                st.append(r)
                r=r.left
            #  走到底,弹出栈顶
            r=st.pop()
            #  如果该节点的没有右节点或者右节点已经访问过
            #  则访问该节点,并且让r指向空,
            #  因为访问过该节点后,该节点的左子树必定访问过,
            #  不应再往左节点走,而是再弹出栈顶元素
            if not r.right or r.right==prev:
                res.append(r.val)
                prev = r
                r = None
            #  否则,再次入栈,访问右节点
            else:
                st.append(r)
                r = r.right
        return res

856

题目描述:
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
() 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。

示例:
在这里插入图片描述
解答:

class Solution:
    def scoreOfParentheses(self, S: str) -> int:
        '''
        #eval( )函数,用于去掉字符串上的引号
        return eval(S.replace(')(',')+(').replace('()','1').replace('(','2*('))
        '''
        '''
        s = ''
        for i in range(len(S)-1):
            if S[i] == '(':
                if S[i+1] == "(": 
                    s += "("
                else:
                    s += '1'
            else:
                if S[i+1] == '(':
                    s += '+'
                else:
                    s += ')*2'
        return eval(s)
        '''
        stack = [0]
        for c in S:
            if c == "(": # "("入栈
                stack.append(0)
            else:
                last = stack.pop()
                if last == 0: # "()"情况
                    stack[-1] += 1
                else: # "(A)" "AB" 情况
                    stack[-1] += 2 * last
        return stack.pop()

1003

题目描述:
给你一个字符串 s ,请你判断它是否 有效 。
字符串 s 有效 需要满足:假设开始有一个空字符串 t = “” ,你可以执行 任意次 下述操作将 t 转换为 s :
将字符串 “abc” 插入到 t 中的任意位置。形式上,t 变为 tleft + “abc” + tright,其中 t == tleft + tright 。注意,tleft 和 tright 可能为 空 。
如果字符串 s 有效,则返回 true;否则,返回 false。

示例:
在这里插入图片描述
解答:

class Solution:
    def isValid(self, s: str) -> bool:
        '''
        while s!=''and 'abc'in s:
            s=s.replace('abc','')
        return s==''
        '''
        res=[]
        for i in s:
            if len(res)<2:
                res.append(i)
            elif i=='c' and res[-1]=='b' and res[-2]=='a':
                res.pop()
                res.pop()
            else:
                res.append(i)
        return len(res)==0

1130

题目描述:
给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:
每个节点都有 0 个或是 2 个子节点。
数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。(知识回顾:如果一个节点有 0 个子节点,那么该节点为叶节点。)
每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。
在所有这样的二叉树中,返回每个非叶节点的值的最小可能总和。这个和的值是一个 32 位整数。

示例:
在这里插入图片描述
解答:

class Solution:
    def mctFromLeafValues(self, arr: List[int]) -> int:
        stack = []
        mct = 0
        for num in arr:
            while stack and num > stack[-1]:
                min_1 = stack.pop()
                if stack:
                    min_2 = min(stack[-1],num)
                else:
                    min_2 = num
                mct = mct + min_1 * min_2
            
            stack.append(num)
        
        while len(stack) > 1:
            mct = mct + stack.pop() * stack[-1]

        return mct; 

1178

题目描述:
外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。
字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:
单词 word 中包含谜面 puzzle 的第一个字母。
单词 word 中的每一个字母都可以在谜面 puzzle 中找到。
例如,如果字谜的谜面是 “abcdefg”,那么可以作为谜底的单词有 “faced”, “cabbage”, 和 “baggage”;而 “beefed”(不含字母 “a”)以及 “based”(其中的 “s” 没有出现在谜面中)。
返回一个答案数组 answer,数组中的每个元素 answer[i] 是在给出的单词列表 words 中可以作为字谜迷面 puzzles[i] 所对应的谜底的单词数目。

示例:
在这里插入图片描述
解答:

'''
①不用考虑words[i]中重复的字符,以及字符的顺序
换句话说就是 “abbbbcd” 与 "aaaaadcb"应该有相同的hash值(a, b, c, d)
于是我们可以想到计数器
②对于每个puzzles[i],长度固定为7
于是我们可以在有限的空间内列举出所有puzzles[i]的组合
如: "abcdefg"的所有组合
'a', 'b', 'c', 'd', 'e', 'f' , 'g'
'ab', 'ac', 'ad' ......'abc', 'abd'........'abcdefg'
对于其中某个组合'abcd'来说,它的hash值为(a, b, c, d)可以匹配所有words中hash值为(a, b, c, d)的word, 如"abbbbbcd", ”aaaaaaadcb“ 同理组合'abc'可以匹配所有hash值为(a, b, c)的word
将所有组合可匹配的值加起来,就是我们puzzles[i]对应的answer[i]
③word必须包含puzzle的第一个字母
很简单,修改我们的组合思路
我们把除头字母外的puzzle[ i ]也就是puzzle[ i ][ 1 : ]进行组合,在每个组合结果上加上头字母就可满足
如'abcdefg':
查询的hash值应该为'a' + comb('bcdefg')(<-表示'bcdefg'的所有组合情况)
'''

from collections import Counter
from itertools import combinations

class Solution:
    def findNumOfValidWords(self, words: List[str], puzzles: List[str]) -> List[int]:
        counter, ans = Counter(filter(lambda x: len(x) <= 7, map(frozenset, words))), [0]*(len(puzzles))
        for index, puzzle in enumerate(puzzles):
            for comb in list(map(lambda i:combinations(puzzle[1:], i), range(7))):
                ans[index] += sum(counter[frozenset((puzzle[0],)+ele)] for ele in comb)
        return ans

猜你喜欢

转载自blog.csdn.net/yeqing1997/article/details/114111034