小黑代码
# 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 isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
self.match_sub = False
# 匹配函数
def match(node,sub_node):
# 全部为空
if not (node or sub_node):
return True
# 有一个为空
if (node==None) ^ (sub_node==None):
return False
# val不相等
if node.val != sub_node.val:
return False
match_left = match(node.left,sub_node.left)
match_right = match(node.right,sub_node.right)
return match_left and match_right
def dfs(node):
if (not node) or self.match_sub:
return
if match(node,subRoot):
self.match_sub = True
dfs(node.left)
dfs(node.right)
dfs(root)
return self.match_sub
KMP匹配法
# 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 isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
# 树和子树的特殊先序遍历
pre_root = []
pre_subRoot = []
# 获取先序遍历
def dfs(node, arr):
if not node:
arr.append('#')
return
arr.append(node.val)
dfs(node.left, arr)
dfs(node.right, arr)
# kmp匹配算法
def kmp(patt, string):
# 生成next数组
i = 1
next_ = [0]
prefix_len = 0
while i < len(patt):
if patt[i]==patt[prefix_len]:
i += 1
prefix_len += 1
next_.append(prefix_len)
else:
if not prefix_len:
next_.append(0)
i += 1
else:
prefix_len = next_[prefix_len-1]
# 开始匹配
i = 0
j = 0
while i < len(string):
if string[i]==patt[j]:
i += 1
j += 1
else:
if not j:
i += 1
else:
j = next_[j-1]
if j == len(patt):
return True
return False
# 执行函数,获取先序遍历
dfs(root, pre_root)
dfs(subRoot, pre_subRoot)
return kmp(pre_subRoot, pre_root)
小黑生活
还是收到了奇安信的感谢信,骂声一片
第一次做抗原,阴性
寒风中去运动啦
自己洗的衣服,晾在暖气上
公司的生活
去吃黑色星期四,竟然不让堂食
小黑不知不觉最后一次去公司
公司发的抗原啦
跟逗兄晚上约个巴西烤肉
去买个咖啡搓个澡
去拔了罐,经过可怕的发热门诊
第二天抗原果然阳性
我的牛逼同事
在胡同里康复的两天
回来一测,变成弱阳了
按摩享受生活,得知自己被劝退
遇到的奇葩招聘
电影卡里还剩那么一点点,赶紧去看
小黑宿舍沦陷了,去门口飞速吃了个串,但是吃不出味道
约了好久不见的在新华社实习的黑山羊学姐出去转转,聊了聊天,感觉心中被带来了些阳光