Uriel's Corner

Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
posts - 0, comments - 50, trackbacks - 0, articles - 594
给出一棵树,parent[i]代表节点i的父节点ID,以及一个字符串s,s[i]代表每个节点的字符值,求树中最长的一条满足相邻节点字符值不同的path的长度,DFS
先用dict建树,保存与每个节点i相连的节点,然后DFS到每个节点处时,若为叶子结点,返回1,否则搜索该节点所有子节点,找出每个子树i中符合要求的path长度l[i],如果子节点和当前节点字符值不一样,那么以当前节点为根,经过子树i最多可以取长度为max(l[1:i-1]) + l[i] + 1,DFS每一层返回值为max(l)

 1 #2246
 2 #Runtime: 1720 ms (Beats 70.91%)
 3 #Memory: 139.6 MB (Beats 72.12%)
 4 
 5 class Solution(object):
 6     def longestPath(self, parent, s):
 7         """
 8         :type parent: List[int]
 9         :type s: str
10         :rtype: int
11         """
12         p = defaultdict(list)
13         for i in range(1, len(parent)):
14             p[parent[i]].append(i)
15         self.ans = 1
16 
17         def DFS(r):
18             if not p[r]:
19                 return 1
20             t = 1
21             for i in p[r]:
22                 l = DFS(i)
23                 if s[r] != s[i]:
24                     self.ans = max(l + t, self.ans)
25                     t = max(t, l + 1)
26             return t
27 
28         DFS(0)
29         return self.ans




只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理