这个题目花了我很多时间,这里我犯了一个错误,大家能发现吗
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if (strs.length === 1) {
return strs[0];
}
let map = new Map();
strs.forEach((item) => {
item.split('').forEach(( (it, index) => {
if(map.has(index)) {
let arr1 = map.get(index);
arr1.push(it);
map.set(index, arr1);
} else {
let arr = [];
arr.push(it);
map.set(index, arr);
}
}))
})
let res = '';
console.log(map)
map.forEach((item, index) => {
if (item.length === strs.length) {
for (let i = 0; i < item.length - 1; i++) {
if (item[i] !== item[i + 1]) {
console.log(item[i], item[i + 1]);
console.log(res);
return res;
} else if (i === item.length - 2) {
res += item[i];
}
}
}
})
};
let strs = ["flower","flow","flight"];
let a = longestCommonPrefix(strs);
console.log(a);
这个错误就在return这里,我遍历map用的是foreach回调函数,这里的return只是回调函数的return,并不是整个大函数的return 因此这里获取不到结果
回调函数里的return只会终止一次循环,不会影响下一次循环
最终修改版:
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if (strs.length === 0) return "";
if (strs.length === 1) return strs[0];
let map = new Map();
strs.forEach((item) => {
item.split('').forEach(( (it, index) => {
if(map.has(index)) {
let arr1 = map.get(index);
arr1.push(it);
map.set(index, arr1);
} else {
let arr = [];
arr.push(it);
map.set(index, arr);
}
}))
})
let res = '';
for (let v = 0; v < map.size; v++) {
let arr = map.get(v);
if (arr.length === strs.length) {
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] !== arr[i + 1]) {
return res;
} else if (i === arr.length - 2) {
res += arr[i];
}
}
}
}
return res;
};
思路: 遍历数组,将每个字符串split切割成数组,遍历这个数组将每个数组第i个元素放入map结构key为i的键值对中,之后遍历map,如果键值对的长度等于输入数组的长度,且键值对的value数组中每个字母都一样就把这个字符记录下来。
其实用二维数组应该也可以实现,但今天没什么时间看了~只能先这样了
我看官方给的答案这个好像叫纵向遍历