思路简单,附上注释代码
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
map<int, char>mp;//切记使用map不要使用unordered_map,否则visual studio运行结果与Linux上不同,这道题也过不了
//将vectors容器中第一个string对象全部放在mp中,key为char字符的位置,value为char字符
for (int i = 0; i < strs[0].size(); ++i)
{
mp[i] = strs[0][i];
}
//从vectors容器中第二个string对象开始遍历
for (int i = 1; i < strs.size(); ++i)
{
if (strs[i].size() == 0)//如果有string对象strs[i] == "",直接返回
return "";
for (int j = 0; j < strs[i].size(); ++j)
{
if (mp[j] == strs[i][j])//str[i]中第j个元素与mp中key=j的键值对相等的情况
{
//如果在第j个string成员的末尾也匹配,且mp没有到结尾,则删除mp[j]之后的所有键值对,并跳出循环。例如strs = {"aaacc","aaa","aaba" },在遍历"aaa"时,mp开始为{0-a,1-a,2-a,3-a,4-a},当遍历到strs[1][2]时mp[j] == strs[i][j]仍旧相等,此时需要把3-a,4-a删除,因为最长的前缀是"aaa"
if (j == strs[i].size() - 1 && mp.find(j) != mp.end())
{
myErase(mp, j + 1);
}
if (j != strs[i].size() - 1 && mp.find(j + 1) == mp.end())
break;
}
else//不相等则删除mp中键从j开始的所有键值队,并跳出这层循环,开始遍历第j+1个string对象
{
myErase(mp, j);
//if (i == strs.size() - 1)
break;
}
}
}
string ress = "";
//将mp转换成string,最后输出
if (mp.size() == 0)
ress = ress;
else
{
for (auto iter = mp.begin(); iter != mp.end(); ++iter)
ress += iter->second;
}
return ress;
}
//更新mp
map<int, char> myErase(map<int, char>&mp, int start)
{
auto iter = mp.begin();
for (int i = 0; i < start; i++)
{
++iter;
}
while (iter != mp.end())
{
//auto ase = ++iter;
mp.erase(iter++);
//iter == ase;
}
return mp;
}
};