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:
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:
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 <= 105
0 <= parent[i] <= n - 1
for alli >= 1
parent[0] == -1
parent
represents a valid tree.s
consists of only lowercase English letters.
Companies: Amazon, Microsoft, HRT
Related Topics:
Array, String, Tree, Depth-First Search, Graph, Topological Sort
Similar Questions:
- Diameter of Binary Tree (Easy)
- Longest Univalue Path (Medium)
- Choose Edges to Maximize Score in a Tree (Medium)
// OJ: https://leetcode.com/problems/longest-path-with-different-adjacent-characters
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(N)
class Solution {
public:
int longestPath(vector<int>& P, string s) {
int N = P.size(), ans = 0;
vector<vector<int>> G(N);
for (int i = 1; i < N; ++i) G[P[i]].push_back(i);
function<int(int, int)> dfs = [&](int u, int prev) {
int a = 0, b = 0;
for (int v : G[u]) {
if (v == prev) continue;
int d = dfs(v, u);
if (s[u] == s[v]) continue;
if (d > a) b = a, a = d;
else if (d > b) b = d;
}
ans = max(ans, 1 + a + b);
return 1 + max(a, b);
};
dfs(0, -1);
return ans;
}
};