class Solution {
public:
int longestPath(vector<int>& parent, string s) {
}
};
2246. 相邻字符不同的最长路径
给你一棵 树(即一个连通、无向、无环图),根节点是节点 0
,这棵树由编号从 0
到 n - 1
的 n
个节点组成。用下标从 0 开始、长度为 n
的数组 parent
来表示这棵树,其中 parent[i]
是节点 i
的父节点,由于节点 0
是根节点,所以 parent[0] == -1
。
另给你一个字符串 s
,长度也是 n
,其中 s[i]
表示分配给节点 i
的字符。
请你找出路径上任意一对相邻节点都没有分配到相同字符的 最长路径 ,并返回该路径的长度。
示例 1:
输入:parent = [-1,0,0,1,1,2], s = "abacbe" 输出:3 解释:任意一对相邻节点字符都不同的最长路径是:0 -> 1 -> 3 。该路径的长度是 3 ,所以返回 3 。 可以证明不存在满足上述条件且比 3 更长的路径。
示例 2:
输入:parent = [-1,0,0,0], s = "aabc" 输出:3 解释:任意一对相邻节点字符都不同的最长路径是:2 -> 0 -> 3 。该路径的长度为 3 ,所以返回 3 。
提示:
n == parent.length == s.length
1 <= n <= 105
i >= 1
,0 <= parent[i] <= n - 1
均成立parent[0] == -1
parent
表示一棵有效的树s
仅由小写英文字母组成原站题解
golang 解法, 执行用时: 236 ms, 内存消耗: 44 MB, 提交时间: 2023-10-10 23:04:18
func longestPath(parent []int, s string) (ans int) { n := len(parent) g := make([][]int, n) for i := 1; i < n; i++ { pa := parent[i] g[pa] = append(g[pa], i) } var dfs func(int) int dfs = func(x int) (maxLen int) { for _, y := range g[x] { len := dfs(y) + 1 if s[y] != s[x] { ans = max(ans, maxLen+len) maxLen = max(maxLen, len) } } return } dfs(0) return ans + 1 } func max(a, b int) int { if b > a { return b }; return a }
java 解法, 执行用时: 109 ms, 内存消耗: 101.7 MB, 提交时间: 2023-10-10 23:04:01
class Solution { List<Integer>[] g; String s; int ans; public int longestPath(int[] parent, String s) { this.s = s; var n = parent.length; g = new ArrayList[n]; Arrays.setAll(g, e -> new ArrayList<>()); for (var i = 1; i < n; i++) g[parent[i]].add(i); dfs(0); return ans + 1; } int dfs(int x) { var maxLen = 0; for (var y : g[x]) { var len = dfs(y) + 1; if (s.charAt(y) != s.charAt(x)) { ans = Math.max(ans, maxLen + len); maxLen = Math.max(maxLen, len); } } return maxLen; } }
cpp 解法, 执行用时: 352 ms, 内存消耗: 196.9 MB, 提交时间: 2023-10-10 23:03:48
class Solution { public: int longestPath(vector<int> &parent, string &s) { int n = parent.size(); vector<vector<int>> g(n); for (int i = 1; i < n; ++i) g[parent[i]].push_back(i); int ans = 0; function<int(int)> dfs = [&](int x) -> int { int maxLen = 0; for (int y : g[x]) { int len = dfs(y) + 1; if (s[y] != s[x]) { ans = max(ans, maxLen + len); maxLen = max(maxLen, len); } } return maxLen; }; dfs(0); return ans + 1; } };
python3 解法, 执行用时: 576 ms, 内存消耗: 143.8 MB, 提交时间: 2023-10-10 23:03:31
class Solution: def longestPath(self, parent: List[int], s: str) -> int: n = len(parent) g = [[] for _ in range(n)] for i in range(1, n): g[parent[i]].append(i) ans = 0 def dfs(x: int) -> int: nonlocal ans max_len = 0 for y in g[x]: len = dfs(y) + 1 if s[y] != s[x]: ans = max(ans, max_len + len) max_len = max(max_len, len) return max_len dfs(0) return ans + 1