题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。
所有输入只包含小写字母 a-z 。
思路
一开始思路是 :
通过输入的字符串数组的第一项,获得一个正则表达式。
考虑到题意中的最长,所以我设置的正则表达式初始值是这个字符串数组第一项的全部,然后每次循环递减。
但是发现如果第一项并不是最短的一项的话就会造成循环的次数是根据字符串数组第一项的长度来进行的,这样造成了性能的浪费。(也可以排序或者通过其他的判断之后是用最短的一项来进行正则的设置,但我没有去写)。
所以第二次对于一开始的思路进行了改进:
将正则表达式的初始值设置成字符串数组第一项的第一个字符,然后从左到右依次递增进行匹配。
最后的没有通过正则来实现,实现的思路是:
设置一个要返回的结果字符串(初始值为空),
取出传入的字符串数组的第一项,然后逐位与字符串数组的二、三项进行相同位数上的比较。
如果比较的结果为真,就将结果字符串拼接上这个字符;
如果比较结果为假,那么直接返回字符串。
第一次的解法
- 用时:276ms
- 内存消耗:49MB
var longestCommonPrefix = function(strs) {
if (strs.length === 0) {
return ''
}
if (strs.length === 1) {
return strs[0];
}
var flag = 1;
for (var i = 0; i < strs[0].length; i++) {
var strTemp = strs[0].slice(0, strs[0].length - i),
regTemp = '^' + strTemp,
reg = new RegExp(regTemp);
for (var j = 1; j < strs.length; j++) {
if (!reg.test(strs[j])) {
flag = 1;
break;
}
flag++;
if (flag === strs.length) {
return strTemp
}
}
}
if (flag !== strs.length) {
return ''
}
};
第二次的解法(对第一种方法的改进)
改进后
- 用时:64ms
- 内存消耗:35.1MB
var longestCommonPrefix = function(strs) {
if (strs.length === 0) {
return ''
}
if (strs.length === 1) {
return strs[0];
}
var flag = 1,
result = '';
for (var i = 0; i < strs[0].length; i++) {
var strTemp = strs[0].slice(0, i + 1),
regTemp = '^' + strTemp,
reg = new RegExp(regTemp);
for (var j = 1; j < strs.length; j++) {
if (!reg.test(strs[j])) {
return result
}
flag++;
if (flag === strs.length) {
flag = 1;
result = strTemp;
}
}
}
return result;
};
第三次的解法
- 用时:64ms
- 内存消耗:35.2MB
var longestCommonPrefix = function(strs) {
if (strs.length === 0) {
return ''
}
if (strs.length === 1) {
return strs[0];
}
var strTemp = strs[0],
strTempLen = strTemp.length,
arrLen = strs.length,
result = '',
flag = 1,
charTemp;
for (var i = 0; i < strTempLen; i++) {
charTemp = strTemp[i];
for (var j = 1; j < arrLen; j++) {
if (charTemp !== strs[j][i]) {
return result;
}
flag++;
if (flag === arrLen) {
flag = 1;
result += charTemp;
}
}
}
return result;
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。