题目地址:
https://leetcode.com/problems/longest-path-with-different-adjacent-characters/description/
给定一个 n n n个点的树,点的标号是 0 ∼ n − 1 0\sim n-1 0∼n−1, 0 0 0是树根,每个点的父亲由 p p p数组给出。每个点 i i i对应一个字母 s [ i ] s[i] s[i]。问相邻点对应字母不同的路径中最长的那个路径的长度。
思路是分治,对于点 u u u,先递归求解其所有儿子子树的解,然后考虑经过点 u u u的解。显然我们需要分治的时候DFS返回从儿子向下能走的最长路径,关于点 u u u,只挑选不等于 s [ u ] s[u] s[u]的那些儿子中的两个的最长路径即可。代码如下:
class Solution {
public:
vector<int> h, e, ne;
int idx;
int longestPath(vector<int>& pa, string s) {
int n = pa.size();
h.resize(n, -1);
e.resize(n);
ne.resize(n);
for (int i = 1; i < n; i++) {
int a = pa[i], b = i;
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int res = 1;
dfs(0, s, res);
return res;
}
int dfs(int u, auto& s, int& res) {
int len1 = 0, len2 = 0;
for (int i = h[u]; ~i; i = ne[i]) {
int v = e[i];
// 先分治求解子问题
int len = dfs(v, s, res);
if (s[v] != s[u]) {
if (len >= len1)
len2 = len1, len1 = len;
else if (len > len2)
len2 = len;
}
}
res = max(res, 1 + len1 + len2);
return 1 + len1;
}
};
时空复杂度 O ( n ) O(n) O(n)。