题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
解法
方法一
暴力解法。双层遍历,第一层遍历字符串,第二层遍历字符串数组,并判断是否存在公共前缀。
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
let has_common = true;
const first = strs[0];
if (first == undefined) return '';
for (let i = 1; i <= first.length; i++) {
const str = first.substring(0, i);
for (let j = 1; j < strs.length; j++) {
if (strs[j].substring(0, i) !== str) {
has_common = false;
break;
}
}
// 若本次遍历不存在公共字符,则返回上一次遍历结果
if (!has_common) return str.substring(0, i-1);
}
// 若全部通过遍历,则最长公共前缀为字符串自身
return first;
};
方法二
原理如图:
image.png
简单地说,查找一组字符串的最长公共前缀,等于任意两个字符串的公共前缀,公式如下:
image.png
var longestCommonPrefix = function(strs) {
let prefix = strs[0];
if (prefix == undefined || prefix == '') return '';
for (let i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) !== 0) {
prefix = prefix.substr(0, prefix.length - 1);
if (prefix == '') return '';
}
}
return prefix;
};
时间复杂度为: O(S),S为所有字符串中字符数量的总和。
空间复杂度为:O(1)