Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
菜鸟还要从第4题继续
一、题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串
""。
提示: 1 <= strs.length <= 200 0 <= strs[i].length <= 200 strs[i] 仅由小写英文字母组成
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
纵向扫描,暴力求解,一个一个位数去比。用charAt,substring方法处理字符串
横向扫描 时间复杂度:O(mn) n 表示字符串数组中所有字符串的平均长度,m 表示字符串数组的大小空间复杂度:O(1)
参考官方题解,针对横向扫描可以用分治的方法处理,时间复杂度:O(mn)
三、AC 代码:
1、纵向扫描
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs.length==0) return ''
let m = strs.length
let n = strs[0].length
for(let i=0;i<n;i++){
nowChar = strs[0].charAt(i)
for(let j=1;j<m;j++){
if (strs[j].length == i || strs[j].charAt(i) != nowChar) {
return strs[0].substring(0, i);
}
}
}
return strs[0] //当strs[0]本身是公共前缀时(最短)
};
2、横向扫描
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs.length==0) return ''
let m = strs.length
let prefix = strs[0]
for(let i=1;i<m;i++){
if(prefix=='')break
prefix=contrastPrefix(prefix,strs[i])
}
return prefix
};
var contrastPrefix = function( prefix, str ){
let n = Math.min(prefix.length,str.length)
for(let j=0;j<n;j++){
if (str.charAt(j) != prefix.charAt(j)) {
return prefix.substring(0, j);
}
}
return prefix.substring(0,n)//两个相等时,或者str为''时
}
3、分治
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs.length==0||strs==null) return ''
return leftRight(strs,0,strs.length-1)
};
var leftRight = function(strs, left , right ){
if (left == right) {
return strs[left];
} else {
let mid = Math.floor((right - left) / 2 )+ left;
let lcpLeft = leftRight(strs, left, mid);
let lcpRight = leftRight(strs, mid + 1, right);
return contrastPrefix(lcpLeft, lcpRight);
}
}
var contrastPrefix = function( prefix, str ){
let n = Math.min(prefix.length,str.length)
for(let j=0;j<n;j++){
if (str.charAt(j) != prefix.charAt(j)) {
return prefix.substring(0, j);
}
}
return prefix.substring(0,n)
}