最长公共前缀
原题目最长公共前缀
题目介绍
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
-
示例 1:
输入: ["flower","flow","flight"] 输出: "fl".
-
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
解法1
我们可以定义一个函数求两个字符串的公共前缀getLongestCommonPrefixByTwoString(str1, str2)。
这时候我们每次求出的公共前缀和下一个字符串再求公共前缀,直至最后一个,就可以得出我们最终想要的结果了。
/**
* @param {string[]} strs
* @return {string}
*/
var getLongestCommonPrefixByTwoString = function(string1, string2) {
for(let i = 0; ;i++) {
if(!string1[i] || !string2[i] || string1[i] !== string2[i]) {
return string1.slice(0, i)
}
}
}
var longestCommonPrefix = function(strs) {
if(strs.length < 2) {
return strs[0] || ''
}
return strs.reduce((str1, str2) => getLongestCommonPrefixByTwoString(str1, str2))
};
解法2
假设我们的输入是:
[
'1234567890a',
'1234567890a',
'1'
]
如果用解法1,这时候我们需要运行23次,才能得出最终的结果。但是我们知道,我们实际上只需要依次比较输入的数组的前缀6次就能得到最终的答案。
因此我们作出以下优化:
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs.length < 2) {
return strs[0] || ''
}
for(let i = 0; ;i++) {
for(let j = 1; j < strs.length ;j++) {
if(
!strs[j-1] ||
!strs[j] ||
!strs[j-1][i] ||
!strs[j][i] ||
strs[j-1][i] !== strs[j][i]
) {
return strs[0].slice(0, i)
}
}
}
};