给你一些区域列表 regions
,每个列表的第一个区域都包含这个列表内所有其他区域。
很自然地,如果区域 X
包含区域 Y
,那么区域 X
比区域 Y
大。
给定两个区域 region1
和 region2
,找到同时包含这两个区域的 最小 区域。
如果区域列表中 r1
包含 r2
和 r3
,那么数据保证 r2
不会包含 r3
。
数据同样保证最小公共区域一定存在。
示例 1:
输入:
regions = [["Earth","North America","South America"],
["North America","United States","Canada"],
["United States","New York","Boston"],
["Canada","Ontario","Quebec"],
["South America","Brazil"]],
region1 = "Quebec",
region2 = "New York"
输出:"North America"
提示:
2 <= regions.length <= 10^4
region1 != region2
- 所有字符串只包含英文字母和空格,且最多只有 20 个字母。
C++
class Solution {
public:
string findSmallestRegion(vector<vector<string>>& regions, string region1, string region2)
{
map<string,string> tmp;
for(int i=0;i<regions.size();i++)
{
for(int j=1;j<regions[i].size();j++)
{
tmp[regions[i][j]]=regions[i][0];
}
}
vector<string> tmp1={region1};
while(tmp.find(region1)!=tmp.end())
{
tmp1.push_back(tmp[region1]);
region1=tmp[region1];
}
vector<string> tmp2={region2};
while(tmp.find(region2)!=tmp.end())
{
tmp2.push_back(tmp[region2]);
region2=tmp[region2];
}
string ans;
vector<string> large;
vector<string> small;
if(tmp1.size()>tmp2.size())
{
large=tmp1;
small=tmp2;
}
else
{
large=tmp2;
small=tmp1;
}
for(int i=0;i<small.size();i++)
{
for(int j=0;j<large.size();j++)
{
if(small[i]==large[j])
{
ans=small[i];
return ans;
}
}
}
return ans;
}
};