2023-01-13 Daily Challenge
Today I have done leetcode's January LeetCoding Challenge with cpp
.
January LeetCoding Challenge 13
Description
Longest Path With Different Adjacent Characters
You are given a tree (i.e. a connected, undirected graph that has no cycles) rooted at node 0
consisting of n
nodes numbered from 0
to n - 1
. The tree is represented by a 0-indexed array parent
of size n
, where parent[i]
is the parent of node i
. Since node 0
is the root, parent[0] == -1
.
You are also given a string s
of length n
, where s[i]
is the character assigned to node i
.
Return the length of the longest path in the tree such that no pair of adjacent nodes on the path have the same character assigned to them.
Example 1:
Input: parent = [-1,0,0,1,1,2], s = "abacbe" Output: 3 Explanation: The longest path where each two adjacent nodes have different characters in the tree is the path: 0 -> 1 -> 3. The length of this path is 3, so 3 is returned. It can be proven that there is no longer path that satisfies the conditions.
Example 2:
Input: parent = [-1,0,0,0], s = "aabc" Output: 3 Explanation: The longest path where each two adjacent nodes have different characters is the path: 2 -> 0 -> 3. The length of this path is 3, so 3 is returned.
Constraints:
n == parent.length == s.length
1 <= n <= 105
0 <= parent[i] <= n - 1
for alli >= 1
parent[0] == -1
parent
represents a valid tree.s
consists of only lowercase English letters.
Solution
class Solution {
vector<vector<int>> neighbors;
int answer = 0;
int dfs(int current, const string &s) {
int mmax1 = 0;
int mmax2 = 0;
for(auto next : neighbors[current]) {
int l = dfs(next, s);
answer = max(answer, l);
if(s[next] == s[current]) continue;
if(l > mmax1) {
mmax2 = mmax1;
mmax1 = l;
} else {
mmax2 = max(mmax2, l);
}
}
answer = max(answer, 1 + mmax1 + mmax2);
return 1 + mmax1;
}
public:
int longestPath(vector<int>& parent, string s) {
int len = parent.size();
neighbors.resize(len);
for(int i = 1; i < len; ++i) {
neighbors[parent[i]].push_back(i);
}
dfs(0, s);
return answer;
}
};
// Accepted
// 141/141 cases passed (392 ms)
// Your runtime beats 93.15 % of cpp submissions
// Your memory usage beats 71.15 % of cpp submissions (181.1 MB)