题目
题目链接:leetcode-cn.com/leetbook/re…
题解
1、多指针比较字符串
题目是求字符串数组中最长的公共序列,我们以往经常使用双指针做比较两个字符串的题目,而这个题目是比较多个字符串,我们一样可以用多指针的方式来比较;
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
// 边界情况:当字符串数组中的字符串都为空时
if(strs[0] === ''){
return '';
}
const strsLen = strs.length;
let repeatStringArr = [];
let flag = false;
let j = 0;
// 要注意边界情况,即 字符串数组中的所有字符串都一样 和 字符串数组为空 的情况
while(!flag) {
// 一轮比较所有字符串
let i = 0
for(;i < strsLen - 1;i++) {
if(strs[i][j] !== strs[i+1][j]) {
flag = true;
break;
}
}
if(i === strsLen - 1) {
repeatStringArr.push(strs[0][j]);
}
if(flag) {
break;
}
j++;
// 边界情况:当字符串数组中的所有字符串都相同时退出循环
if( strs[0].length <= j ){
break;
}
}
return repeatStringArr.join('');
};
2、从第一个开始字符串两两比较
上面的方法是每一次比较都比较字符串数组中的所有字符串;而这种方法是每次先比较完字符串数组中的其中两个字符串,获取公共字符串,然后将公共字符串和其它未比较的字符串比较;
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs[0] === ''){
return '';
}
const strsLen = strs.length;
let repeatString = strs[0];
// 将重复的前缀逐一和字符串数组中的每一个字符串比较
for(let i = 1;i < strsLen;i++) {
if(repeatString === '') {
return '';
}
// 比较 repeatString 和 strs[i]
const rsLen = repeatString.length,
strLen = strs[i].length;
let m = 0,
n = 0;
while(m <= rsLen && n <= strLen) {
if(repeatString[m++] !== strs[i][n++]) {
break;
}
}
repeatString = repeatString.slice(0,m-1);
}
return repeatString;
};
大家如果有更好的思路和解法,欢迎大家一起来讨论啊~
这是使用 JavaScript 对 LeetCode《初级算法》的每道题的总结和实现的其中一篇,汇总篇在这里: