class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.size()==0) return ""; if(strs.size()==1) return strs[0]; string com_str=strs[0]; for(auto i=strs.begin();i<strs.end();i++) { while((*i).find(com_str,0)!=0) { com_str=com_str.substr(0,com_str.size()-1); if(com_str.size()==0) return ""; } } return com_str; } };
算法二:水平扫描
算法
想象数组的末尾有一个非常短的字符串,使用上述方法依旧会进行 SS 次比较。优化这类情况的一种方法就是水平扫描。我们从前往后枚举字符串的每一列,先比较每个字符串相同列上的字符(即不同字符串相同下标的字符)然后再进行对下一列的比较。
//水平扫描 class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.size()==0) return ""; if(strs.size()==1) return strs[0]; string com_str=strs[0]; for(int i=0;i<com_str.size();i++) { char c=com_str[i]; for(int j=1;j<strs.size();j++) { if(strs[j].size()==i||strs[j][i]!=c) return com_str.substr(0,i); } } return com_str; } };