题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
解题思路
先拿出一个字符串,然后取这个字符串的头一个字母,例如a,判断数组内其他字符串是否以这个字母开头,不是的话直接返回空字符串“”,是的话拿出字符串的头两个字符,例如ab,判断数组内其他字符串是否以这两个字母开头,不是的话直接返回第一个字母a,是的话重复上诉的过程直到取到这个字符串为止,如果数组内其他字符串都以这个字符串开头,那么这个字符串就是最长公共前缀,返回这个字符串即可。完整代码如下:
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs.length === 0) return '';
let str = strs[0];
let prefix = ''
for(let i = 1; i <= str.length; i++){
prefix = str.slice(0,i);
for(let j = 1; j < strs.length; j++){
if(!strs[j].startsWith(prefix)) return prefix.slice(0, -1);
}
}
return prefix;
};
官方解法,点击此处可去
横向扫描,用javascript的代码如下:
var longestCommonPrefix = function(strs) {
if(!strs || !strs.length) return ''
let prefix = strs[0];
for(let i = 1; i < strs.length; i++){
prefix = twoLongestCommonPrefix(prefix, strs[i]);
if(prefix.length === 0) return ''
}
return prefix
}
function twoLongestCommonPrefix(str1, str2){
let length = Math.min(str1.length, str2.length);
let index = 0;
while(index < length && str1[index] === str2[index]) {
index++
};
return str1.substring(0, index);
}
分治,递归思想,javascript代码如下
var longestCommonPrefix = function(strs) {
if(!strs || !strs.length) return '';
return tool(strs, 0, strs.length - 1);
}
function tool(strs, start, end) {
if(start === end) return strs[start];
let mid = Math.floor((end - start)/2) + start;
let leftPrefix = tool(strs, start, mid);
let rightPrefix = tool(strs, mid + 1, end);
return twoLongestCommonPrefix(leftPrefix, rightPrefix);
}
function twoLongestCommonPrefix(str1, str2){
let length = Math.min(str1.length, str2.length);
let index = 0;
while(index < length && str1[index] === str2[index]) {
index++
};
return str1.substring(0, index);
}
写在最后: 若有误,请指正。