一、题目描述
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
。
二、解题思路
1.公共前缀肯定来自数组元素的一部分,因此首先可以选择任意一个元素作为匹配的公共前缀字符串。
2.将当前公共前缀和数组中的元素每一个元素(字符串)比较,每一个元素都是字符串,因此就相当于比较字符串有前几个字符是相同的(公共前缀),然后截取当前公共部分作为当前公共前缀继续与后面的元素的比较;因为公共前缀是大家公共拥有的,所以一遇到不满足,或者需要更短的部分,要及时更新当前公共前缀。
三、解题代码
示例一:
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs.length === 0) return ''
let str = strs[0]
// 拿第一个字符串和后面的比较
for(let i = 1;i<strs.length;i++){
// 与每个字符串的字符比较,直到比较到不一样,然后截取到前面一样的, k < str.length,最长公共前缀
for(let k = 0;k<str.length;k++){
//与每个字符比较,获取前面一样的部分
if(str[k] !== strs[i][k]){
str = str.slice(0,k)
break
}
}
}
return str
};
代码解析:先获取到一个元素字符串作为初始的公共前缀,然后与后面的字符串元素比较,和每个字符串都是从第0个字符开始一个一个比较,直到不相等,然后截取出当前先等的部分作为最新的公共前缀,结束当前元素的比较,继续与下一个字符串比较。
示例二:
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs.length === 0) return ''
let str = strs[0]
for(let i = 1;i<strs.length;i++){
//使用indexOf(str)=== 0 判断str是否属于strs[i]的前面得某一部分,如果不是,缩短str的长度继续判断
while(strs[i].indexOf(str) !== 0){
str = str.slice(0,str.length-1)
if(str.length == 0) return ''
}
}
return str
};
代码解析:思路和上面的一样,只不过在更新当前公共前缀使用了indexOf()方法,indexOf()会返回目标元素第一次出现的位置。若strs[i].indexOf(str) === 0,说明str是strd[i]的前面部分,即公共前缀。如果不等于0,说明前面匹配不到str,缩短str的长度,继续比较,直到有公共的部分,如果str.length === 0,说明没有str为空也没有找到公共的部分,就是没有公共前缀,直接return '' 。