2246.Longest Path With Different Adjacent Characters === ###### tags: `Hard`,`Tree`,`DFS`,`Array`,`String`,`Graph`,`Topological Sort` [2246. Longest Path With Different Adjacent Characters](https://leetcode.com/problems/longest-path-with-different-adjacent-characters/) ### 題目描述 You are given a **tree** (i.e. a connected, undirected graph that has no cycles) **rooted** at node `0` consisting of `n` nodes numbered from `0` to `n - 1`. The tree is represented by a **0-indexed** array `parent` of size `n`, where `parent[i]` is the parent of node `i`. Since node `0` is the root, `parent[0]` == -1. You are also given a string `s` of length `n`, where `s[i]` is the character assigned to node `i`. Return *the length of the **longest path** in the tree such that no pair of **adjacent** nodes on the path have the same character assigned to them*. ### 範例 **Example 1:** ![](https://assets.leetcode.com/uploads/2022/03/25/testingdrawio.png) ``` Input: parent = [-1,0,0,1,1,2], s = "abacbe" Output: 3 Explanation: The longest path where each two adjacent nodes have different characters in the tree is the path: 0 -> 1 -> 3. The length of this path is 3, so 3 is returned. It can be proven that there is no longer path that satisfies the conditions. ``` **Example 2:** ![](https://assets.leetcode.com/uploads/2022/03/25/graph2drawio.png) ``` Input: parent = [-1,0,0,0], s = "aabc" Output: 3 Explanation: The longest path where each two adjacent nodes have different characters is the path: 2 -> 0 -> 3. The length of this path is 3, so 3 is returned. ``` **Constraints**: * `n` == `parent.length` == `s.length` * 1 <= `n` <= 10^5^ * 0 <= `parent[i]` <= `n` - 1 for all `i` >= 1 * `parent[0]` == -1 * `parent` represents a valid tree. * `s` consists of only lowercase English letters. ### 解答 ```python= class Solution: def longestPath(self, parent: List[int], s: str) -> int: def dfs(node): #print('#',node) subtree_stats = [] ans = 1 max2 = [0,0] for child in self.edge[node]: if self.visited[child] == 1: continue self.visited[child] = 1 _ans = dfs(child) if s[child] != s[node]: if _ans > max2[0]: #print('update1') max2 = [_ans, max2[0]] elif _ans > max2[1]: max2[1] = _ans #print(node,child, _ans , max2) ans = sum(max2) + 1 #print(node, max2, ans) self.ans[node] = ans #print('#',node) return max2[0]+1 n = len(s) self.ans = [ 0 for _ in range(n)] self.edge = dict() for i in range(n): self.edge[i] = [] for i, p in enumerate(parent): if i == 0: continue self.edge[p].append(i) self.visited = [ 0 for _ in range(n)] self.visited[0]= 1 root_stat = dfs(0) return max(self.ans) ``` > [name=玉山] 提供一筆測資 S.longestPath([-1,0,0,1,1,2,3,3,3,4,5,5], "abacbeqwyyce" ![](https://i.imgur.com/3G2hpF6.jpg) ```python= class Solution: def longestPath(self, parent: List[int], s: str) -> int: tree = defaultdict(list) for end, start in enumerate(parent): tree[start].append(end) ans = 1 def dfs(node): nonlocal ans max1, max2 = 0, 0 for child in tree[node]: value = dfs(child) if s[node] == s[child]: continue if value > max1: max1, max2 = value, max1 elif value > max2: max2 = value ans = max(ans, max1 + max2 + 1) return max1 + 1 dfs(0) return ans ``` > [name=Yen-Chi Chen][time=Sat, Jan 14, 2023] ### Reference [回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)