题目地址:
https://leetcode.com/problems/longest-path-with-different-adjacent-characters/
给定一棵 n n n个节点的有根树,每个节点的编号 0 ∼ n − 1 0\sim n-1 0∼n−1,并且每个节点 i i i对应一个字符 s [ i ] s[i] s[i]。问树中最长的相邻节点字符不同的路径长度。
枚举路径最高节点,递归求所有当前节点儿子出发向下的最长路径长度,求出不同于当前节点字符的儿子的最长路径前两名,那么也就求出了最高节点为当前节点的最长路径长度。枚举完所有最高点之后即得答案。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
int res;
public int longestPath(int[] parent, String s) {
int n = parent.length;
List<Integer>[] g = new ArrayList[n];
for (int i = 0; i < n; i++) {
g[i] = new ArrayList<>();
}
for (int i = 1; i < n; i++) {
g[parent[i]].add(i);
}
dfs(0, g, s);
return res;
}
int dfs(int u, List<Integer>[] g, String s) {
if (g[u].isEmpty()) {
res = Math.max(res, 1);
return 1;
}
int max1 = 0, max2 = 0;
for (int ne : g[u]) {
int len = dfs(ne, g, s);
if (s.charAt(ne) != s.charAt(u)) {
if (len > max1) {
max2 = max1;
max1 = len;
} else if (len > max2) {
max2 = len;
}
}
}
res = Math.max(res, max1 + 1 + max2);
return 1 + max1;
}
}
时空复杂度 O ( n ) O(n) O(n)。