一、题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
二、测试用例
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
三、解题思路
- 基本思路:
找的是最长前缀,那就每个单词的每个字母从头开始比较,直到不同或者某个单词已经到尾部为止。 - 具体思路:
- 预处理:定义变量 i 和 j ,其中 i 表示第 i 个单词,j 表示单词的第 j 个字母;定义变量 str ,用于存放公共前缀,初始化为空字符串。
- 遍历:选择第 1 个单词作为基准,从头依次选取字母和后面的单词对应位置的字母进行比较,一但越界或者字母不同,则结束循环,表示当前位置的字母已经不一样,或者有单词没有长,则已经寻找完最长前缀;否则,表示所有单词的当前字母都相同,则将当前字母赋值给 str ,然后进行下一个字母。
四、参考代码
时间复杂度:
O
(
m
n
)
\Omicron(mn)
O(mn) 【 m 是最短单词的长度,n 是单词个数】
空间复杂度:
O
(
1
)
\Omicron(1)
O(1)
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int n = strs.size();
string str = "";
int i, j;
for (j = 0; j < strs[0].length(); j++) {
for (i = 1; i < n; i++) {
if (j >= strs[0].length() || j >= strs[i].length() ||
strs[i][j] != strs[0][j]) {
break;
}
}
if (i == n)
str += strs[0][j];
else
break;
}
return str;
}
};