审题
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
看到这道题的话,首先可以想到根据数组中的每一个元素从第 i i i个子元素开始比较,如果所有元素的第 i i i个子元素都相等话,我们转到第 i + 1 i+1 i+1个子元素进行比较, i i i从0开始。
代码实现
在代码中,我们的外层循环的终止条件是遍历到了所有字符串的最小长度,因为最大前缀值也不会超过所有字符串的最小长度。这样可以一定程度上节省一些时间。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if ( strs.size() == 0 ) return ""; // 特判
int flag;
int minsize=strs[0].size();
string s="";
for ( int i=0; i<strs.size(); i++ ) {
if ( strs[i].size()<minsize ) minsize = strs[i].size();
}
for ( int i=0; i<minsize; i++ ) {
flag = 1;
for ( int j=0; j<strs.size()-1; j++ ) {
if ( strs[j][i] != strs[j+1][i] ) {
flag = 0;
break;
}
}
if ( flag ) s+=strs[0][i];
else break;
}
return s;
}
};
代码时间复杂度为 O ( m n ) O(mn) O(mn)其中 m m m是最短的字符串元素长度。
反思
这道字符串题可以说是中规中矩,没有什么特别的地方。