LeetCode1600. 皇位继承顺序(208场周赛) 原题链接:皇位继承顺序
1. 题意
继承顺序:king->长子->长孙,长子的所有后代完了才轮到长子的兄弟。
![图片名称](https://i-blog.csdnimg.cn/blog_migrate/335732bb2fb916c71d38f0871b2ac1f9.png)
2. 思路
容易想到的是建棵N叉树,然后返回顺序为先序遍历(麻烦)。
简单一点的做法可以:
- 通过king索引出他的所有儿子,每个儿子索引出相应的孙子
- 父子关系,可以使用 unordered_map<string, vector<string>> 来记录,key 为父亲名字,value 为按顺序的孩子名字,
父亲添加儿子的同时每个儿子建一个<"名字",vector<"儿子">>对放入map。 - 使用 unordered_set<string> 来标记死亡情况
- 根据父子关系,可以进行深度优先遍历,这样在 dfs 时,根据死亡情况来输出即可
3. 代码注释
变量定义的解释
unordered_map<string, vector<string>> maps
记录族谱
string:父亲名字 vector<string>儿子们名字unordered_set<string> sets
记录已经去世的人
参考代码
void dfs(vector<string>& str, unordered_map<string, vector<string>>& maps,
unordered_set<string>& sets, string temp)
{
if (sets.find(temp) == sets.end())
str.push_back(temp);
auto item = maps.find(temp);
for (auto i : item->second)
dfs(str, maps, sets, i);
}
class ThroneInheritance {
public:
unordered_map<string, vector<string>> maps; //记录族谱
unordered_set<string> sets; //记录death的
public:
ThroneInheritance(string kingName) {
maps.emplace(kingName, vector<string>());
}
void birth(string parentName, string childName) {
auto item = maps.find(parentName);
item->second.push_back(childName); //加入父亲的儿子数组
maps.emplace(childName, vector<string>()); //儿子之后会变成父亲
}
void death(string name) {
sets.insert(name);
}
vector<string> getInheritanceOrder() {
vector<string> str;
dfs(str, maps, sets, "king"); //从king开始索引
return str;
}
};
测试代码
int main()
{
ThroneInheritance *t = new ThroneInheritance("king"); // 继承顺序:king
t->birth("king", "andy"); // 继承顺序:king > andy
t->birth("king", "bob"); // 继承顺序:king > andy > bob
t->birth("king", "catherine"); // 继承顺序:king > andy > bob > catherine
t->birth("andy", "matthew"); // 继承顺序:king > andy > matthew > bob > catherine
t->birth("bob", "alex"); // 继承顺序:king > andy > matthew > bob > alex > catherine
t->birth("bob", "asha"); // 继承顺序:king > andy > matthew > bob > alex > asha > catherine
t->getInheritanceOrder(); // 返回 ["king", "andy", "matthew", "bob", "alex", "asha", "catherine"]
t->death("bob"); // 继承顺序:king > andy > matthew > bob(已经去世)> alex > asha > catherine
/*
t->getInheritanceOrder(); // 返回 ["king", "andy", "matthew", "alex", "asha", "catherine"]
*/
vector<string> str=t->getInheritanceOrder(); // 返回 ["king", "andy", "matthew", "alex", "asha", "catherine"]
for (auto i : str)
cout << i << " ";
cout << endl;
return 0;
}
测试图片
![图片名称](https://i-blog.csdnimg.cn/blog_migrate/a111076cee18c774603a7adb3ad840f9.png)