14 最长前缀
我的 思路 是 先从前面两个串中找到一个待修正的共同前缀,然后再剩余的串中来调整该前缀,这样的时间复杂度为o(n)
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size() == 0) return string("");
if(strs.size() == 1) return strs[0];
unsigned int Minlen,i(0);
string strMax,strMin;
vector<string>::iterator it = strs.begin();
(*it).length() > (*(it + 1)).length() ? (strMax = *it,strMin = *(it + 1)):
(strMin = *it,strMax = *(it + 1));
Minlen = strMin.length();
while(strMax[i] == strMin[i] && i < Minlen) i ++;
string prefix(strMax.begin(),strMax.begin() + i);
for(it = it + 2; it != strs.end(); it ++)
{
if(prefix.size() == 1 && (*(it))[0] != prefix[0])//当前缀为一个字符的时候,所有字符串的第一个
return ""; //字符就必须是该字符
else if(prefix.size() == 1)
continue;
while((*(it)).find(prefix) != 0)//如果不能在字符串的开始处找到,就减去prefix最后一个字符,
{ //直到找到为止
if(0 == prefix.size())
return "";
prefix.resize(prefix.size() - 1);
}
}
return prefix;
}
};
测试用例:
[]
["",""]
[""]
["a","c"]
["ca","a"]
["abcd","ab","acd"]//通过找最长和最短串的公共串,然后再其他串中找该子串的方法不行
["baab","bacb","b","cbc"] //忽略了必须是前缀(前三个共同前缀为"b",如果通过查找,那么会在最后一个串中找到"b"
["abca","aba","aaab"]//同上