golang力扣leetcode 2246.相邻字符不同的最长路径
2246.相邻字符不同的最长路径
题解
题目:给一棵树的每个节点赋一个字符,求一个最长路径,相邻节点的字符不能一样
思路:
- 路径为 t1 <- target -> t2
- t1和t2可以为零
- 枚举target
- 用dfs枚举所有情况
代码
func longestPath(parent []int, s string) (ans int) {
n := len(parent)
//key 父节点 val 子节点,存图
g := make(map[int][]int)
for i := 1; i < n; i++ {
fa := parent[i]
g[fa] = append(g[fa], i)
}
var dfs func(x int) (tLen int)
dfs = func(x int) (maxLen int) {
//最长,次长
fstLong, scdLong := 0, 0
//遍历所有子节点
for _, y := range g[x] {
subLong := dfs(y)
//相邻节点字符不相等
if s[x] != s[y] {
if subLong > fstLong {
scdLong = fstLong
fstLong = subLong
} else if subLong > scdLong {
scdLong = subLong
}
}
}
//更新答案,路径长=最长+次长+本节点1
ans = max(ans, fstLong+scdLong+1)
//返回当前节点下的最长路径+本身这个节点1
return fstLong + 1
}
dfs(0)
return ans
}
func max(a, b int) int {
if b > a {
return b
}
return a
}
