LC 2791. 树中可以形成回文的路径数

https://leetcode.cn/problems/count-paths-that-can-form-a-palindrome-in-a-tree/

这题现在想起来不是很难,感觉对于这类树状的图形使用DFS似乎是唯一的选择,尤其是对于这些n>=10^5的case.

我第一次写法会在每个节点上,逐个比较每个孩子可以产生的匹配,但是这样容易产生特别高的时间复杂度,或者是不太容易控制的时间复杂度。 https://leetcode.cn/problems/count-paths-that-can-form-a-palindrome-in-a-tree/submissions/452163269/

class Solution:
    def countPalindromePaths(self, parent: List[int], s: str) -> int:
        n = len(parent)
        child = [[] for _ in range(n)]
        for i in range(1, n):
            p = parent[i]
            child[p].append(i)

        cnt = Counter([0])

        def search(root, now):
            ans = 0
            for c in child[root]:
                bit = (1 << (ord(s[c]) - ord('a')))
                x = now ^ bit
                ans += cnt[x]
                for i in range(26):
                    ans += cnt[x ^ (1 << i)]
                cnt[x] += 1
                ans += search(c, x)
            return ans

        ans = search(0, 0)
        return ans