最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
codeType
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
codeType
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
codeType
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 如果非空,则仅由小写英文字母组成
解法:
解法1:横向扫描
从0开始,逐个比较每个字符串的字符。字符串平均长度为m,字符串个数为n,那么时间复杂度就是O(mn)
typescript
function longestCommonPrefix(strs: string[]): string {
// 按顺序比较每个字符串
let s: string = ''
let n = strs.length
if(n === 0) return ''
if(n === 1) return strs[0]
let minLength = strs[0].length // 单词的最短长度
for(let i=0; i<n; i++){
minLength = Math.min(minLength, strs[i].length)
}
for(let i=0; i<minLength; i++){ // 比较第i个位置的单词
for(let j=0; j<n; j++){
if(strs[0][i] === strs[j][i]){
continue;
}else{
// 前缀不一致了,直接返回
return s
}
}
s += strs[0][i] // 前缀增长
}
return s
};
解法二:字典排序法
先把字符串按字典排序进行排序,然后直接比较第一个和最后一个字符串就行。时间复杂度应该就是排序的时间复杂度O(mnlogn)
typescript
function longestCommonPrefix(strs: string[]): string {
// 边界条件1:空数组直接返回空字符串
if (strs.length === 0) {
return "";
}
// 1. 对字符串数组进行字典序排序
const sortedStrs = [...strs].sort(); // 展开原数组再排序,避免修改原数组
// 2. 取排序后的最小串(第一个元素)和最大串(最后一个元素)
const minStr = sortedStrs[0];
const maxStr = sortedStrs[sortedStrs.length - 1];
// 3. 逐字符比较,构建公共前缀
let prefix = "";
// 遍历最小串和最大串的最小长度范围内的字符
const minLength = Math.min(minStr.length, maxStr.length);
for (let i = 0; i < minLength; i++) {
if (minStr[i] === maxStr[i]) {
// 字符相同,追加到前缀中
prefix += minStr[i];
} else {
// 字符不同,直接终止循环
break;
}
}
return prefix;
}