这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战
题目描述
有一个字符串数组,然后找到这个数组的最长公共前缀,并返回它,如果没有公共前缀,则返回空字符串''。
举个例子:
arr: ['abc', 'a', 'ab']
返回 ‘a’
arr: ['erta', 'er', 'ert']
返回 ‘er’
arr: ['ab', 'er', 'a']
返回 ‘’
思路分析
第一种方法:
我们可以对字符串数组取第一个为比较对象,遍历数组其它值,都与它进行比较。
然后定义个取公共前缀方法,把比较多字符串传入进行判断,while循环遍历,如果一直相等,则前缀的索引一直递增,直到不相等或者等于字符串本身的长度才返回索引。这个索引会和之前返回的索引比较,取小的。为什么取小的,因为小的才是公共前缀。
遍历结束,最终取到的的就是最长的公共前缀。
代码如下:
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function (strs) {
if (strs.length === 0) return "";
let first = strs[0];
if (first === "") return "";
let minLen = Number.MAX_SAFE_INTEGER;
for (let i = 1; i < strs.length; i++) {
const len = twoStrLongestCommonPrefix(first, strs[i]);
minLen = Math.min(len, minLen);
}
return first.slice(0, minLen);
};
function twoStrLongestCommonPrefix (s, t) {
let i = 0, j = 0;
let cnt = 0;
while (i < s.length && j < t.length) {
if (s[i] === t[j]) {
cnt++;
} else {
return cnt;
}
i++;
j++;
}
return cnt;
}
第二种方法:
因为是求字符串数组的最长公共前缀,所以一定以长度最小的字符串为准,所以我们可以先排好序,根据字符串长度排,最短的排在第一个。
然后我们对第一个的字符串进行遍历,每遍历一次,就取从0到当前索引的字符串,就判断字符串数组的其它项是否每个都包含该字符串,如果包含则把它记录下来。
最后返回。这个就是最长公共前缀。
如果字符串数组长度为0,则返回空字符串。
代码如下:
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function (strs) {
if (strs.length <= 0) return ''
let res = ''
strs.sort((a, b) => a.length - b.length)
let str = strs[0]
for (let i = 0; i < str.length; i++) {
let checkStr = str.slice(0, i + 1)
if (strs.slice(1).every(item => item.slice(0, i + 1) === checkStr)) res = checkStr
}
return res
}