题目来源
题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示
- 1 <= strs.length <= 200
- 0 <= strs[i].length <= 200
- strs[i] 仅由小写英文字母组成
题目解析
本题可以暴力求解。
我们可以假设最长公共前缀 prefix = strs[0],然后遍历其余 strs[i] 和 prefix 取最长公共前缀后,更新 prefix。
C源码实现
char* longestCommonPrefix(char** strs, int strsSize) {
// 设置一个基准,假设strs[0]为最长公共前缀
char* prefix = strs[0];
// 逐个求解strs[i]和prefix的最长公共前缀
for (int i = 1; i < strsSize; i++) {
// 从头开始逐个字符比较
int j = 0;
while (j < strlen(prefix) && j < strlen(strs[i]) && prefix[j] == strs[i][j]) {
j++;
}
// j 可以理解为最长公共前缀的长度
if (j == 0) {
return "";
} else {
prefix[j] = '\0';
}
}
return prefix;
}
C++源码实现
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
// 设置一个基准,假设strs[0]为最长公共前缀
string prefix = strs[0];
// 逐个求解strs[i]和prefix的最长公共前缀
for (int i = 1; i < strs.size(); i++) {
// 从头开始逐个字符比较
int j = 0;
while (j < prefix.length() && j < strs[i].length() && prefix[j] == strs[i][j]) {
j++;
}
// j 可以理解为最长公共前缀的长度
if (j == 0) {
return "";
} else {
prefix = prefix.substr(0, j);
}
}
return prefix;
}
};
Java源码实现
class Solution {
public String longestCommonPrefix(String[] strs) {
// 设置一个基准,假设strs[0]为最长公共前缀
String prefix = strs[0];
// 逐个求解strs[i]和prefix的最长公共前缀
for (int i = 1; i < strs.length; i++) {
// 从头开始逐个字符比较
int j = 0;
while (j < prefix.length() && j < strs[i].length() && prefix.charAt(j) == strs[i].charAt(j)) {
j++;
}
// j 可以理解为最长公共前缀的长度
if (j == 0) {
return "";
} else {
prefix = prefix.substring(0, j);
}
}
return prefix;
}
}
Python源码实现
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
# 设置一个基准,假设strs[0]为最长公共前缀
prefix = strs[0]
# 逐个求解strs[i]和prefix的最长公共前缀
for i in range(1, len(strs)):
# 从头开始逐个字符比较
j = 0
while j < len(prefix) and j < len(strs[i]) and prefix[j] == strs[i][j]:
j += 1
# j 可以理解为最长公共前缀的长度
if j == 0:
return ""
else:
prefix = prefix[:j]
return prefix
JavaScript源码实现
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function (strs) {
// 设置一个基准,假设strs[0]为最长公共前缀
let prefix = strs[0];
// 逐个求解strs[i]和prefix的最长公共前缀
for (let i = 1; i < strs.length; i++) {
// 从头开始逐个字符比较
let j = 0;
while (j < prefix.length && j < strs[i].length && prefix[j] == strs[i][j]) {
j++;
}
// j 可以理解为最长公共前缀的长度
if (j == 0) {
return "";
} else {
prefix = prefix.slice(0, j);
}
}
return prefix;
};