周赛笔记210


第一题:https://leetcode-cn.com/problems/maximum-nesting-depth-of-the-parentheses/
第二题:https://leetcode-cn.com/problems/maximal-network-rank/
第三题:https://leetcode-cn.com/problems/split-two-strings-to-make-palindrome/
第四题:https://leetcode-cn.com/problems/count-subtrees-with-max-distance-between-cities/

一、括号的最大嵌套深度

class Solution:
    def maxDepth(self, s: str) -> int:
        ans=0
        cnt=0
        for i in s:
            if i=="(": ans+=1
            elif i==")": ans-=1
            cnt=max(cnt,ans)
        return cnt

二、最大网络秩

n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络。每个 roads[i] = [ai, bi] 都表示在城市 aibi 之间有一条双向道路。

两座不同城市构成的 城市对 的 网络秩 定义为:与这两座城市 直接 相连的道路总数。如果存在一条道路直接连接这两座城市,则这条道路只计算 一次 。

整个基础设施网络的 最大网络秩 是所有不同城市对中的 最大网络秩 。

给你整数 n 和数组 roads,返回整个基础设施网络的 最大网络秩 。

class Solution:
    def maximalNetworkRank(self, n: int, roads: List[List[int]]) -> int:
        ans=0
        d=defaultdict(list)
        for i,j in roads:
            d[i].append(j)
            d[j].append(i)
        for i in range(n):
            for j in range(i+1,n):
                tmp=len(d[i])+len(d[j])
                if i in d[j]: tmp-=1
                ans=max(ans,tmp)
        return ans

# 穷举

三、分割两个字符串得到回文串

给你两个字符串 ab ,它们长度相同。请你选择一个下标,将两个字符串都在 相同的下标 分割开。由 a 可以得到两个字符串: aprefixasuffix ,满足 a = aprefix + asuffix ,同理,由 b 可以得到两个字符串 bprefixbsuffix ,满足 b = bprefix + bsuffix 。请你判断 aprefix + bsuffix 或者 bprefix + asuffix 能否构成回文串。

当你将一个字符串 s 分割成 sprefixssuffix 时, ssuffix 或者 sprefix 可以为空。比方说, s = "abc" 那么 "" + "abc""a" + "bc""ab" + "c""abc" + "" 都是合法分割。

如果 能构成回文字符串 ,那么请返回 true,否则返回 false

class Solution:
    def checkPalindromeFormation(self, a: str, b: str) -> bool:
        def check(str1,str2,left):
            right=len(str1)-1-left
            while(left>=0 and right<len(str1)):
                if str1[left]!=str2[right]: break
                left-=1
                right+=1
            return left
        left=len(a)//2-1               #第一次检测的下标
        left=min(check(a,a,left),check(b,b,left))
        left=min(check(a,b,left),check(b,a,left))
        return left==-1                #检测是否扩展到底

# 核心思路:中心扩展
# 第一步:前a后a,前b后b,找到中间的回文串
# 第二步:开始拼接

四、统计子树间最大距离

任意城市之间只有唯一的一条路径。换句话说,所有城市形成了一棵 树 。

输入:n = 4, edges = [[1,2],[2,3],[2,4]]
输出:[3,4,0]
解释
子树 {1,2}, {2,3} 和 {2,4} 最大距离都是 1 。
子树 {1,2,3}, {1,2,4}, {2,3,4} 和 {1,2,3,4} 最大距离都为 2 。
不存在城市间最大距离为 3 的子树。

class Solution:
    def countSubgraphsForEachDiameter(self, n, edges):
        d=defaultdict(list)
        for i, j in edges:
            d[i - 1].append(j - 1)
            d[j - 1].append(i - 1)

        def maxd(mask0):
            res = 0
            for i in range(n):
                if (1 << i) & mask0:
                    mask = mask0
                    bfs, bfs2 = [i], []
                    cur = 0
                    while bfs:
                        for i in bfs:
                            mask ^= 1 << i
                            for j in d[i]:
                                if mask & (1 << j):
                                    bfs2.append(j)
                        cur += 1
                        bfs, bfs2 = bfs2, []
                    if mask: return 0
                    res = max(res, cur - 1)
            return res

        res = [0] * (n - 1)
        for mask in range(1 << n):
            if mask & (mask - 1) == 0: continue
            k = maxd(mask)
            if k:
                res[k - 1] += 1

        return res

# copy
# 不懂

文章作者: ╯晓~
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ╯晓~ !
评论
  目录