编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 2000 <= strs[i].length <= 200strs[i]如果非空,则仅由小写英文字母组成
cpp
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
/**
* @brief 查找字符串数组中所有字符串的最长公共前缀
* @param strs 输入的字符串数组,存储待查找公共前缀的所有字符串
* @return string 所有字符串的最长公共前缀;若不存在公共前缀或数组为空,返回空字符串
*/
string longestCommonPrefix(vector<string>& strs) {
int index = 0; // 公共前缀的起始索引(固定为0,从字符串开头开始匹配)
int rindex = 0; // 记录当前匹配成功的公共前缀长度(即已匹配的字符个数)
int n = strs.size(); // 字符串数组的长度(待匹配字符串的个数)
// 边界处理1:若输入数组为空,直接返回空字符串(无字符串可匹配)
if (n == 0) return "";
int len = strs[0].size(); // 以数组第一个字符串为基准,获取其长度(作为匹配的最大边界)
string str = strs[0]; // 取出第一个字符串作为基准字符串,后续所有字符串与它对比
// 外层循环:遍历基准字符串的每个字符(从第0位开始)
for (int i = 0; i < len; i++) {
char a = str[i]; // 当前基准字符串的第i位字符(待匹配的目标字符)
int flag = 0; // 匹配标记:0表示当前字符匹配成功,1表示匹配失败
// 内层循环:将基准字符与数组中其他所有字符串的第i位字符对比
for (int j = 0; j < n; j++) {
// 若当前字符串的第i位字符不存在(长度不足)或与基准字符不相等,标记匹配失败
if (a != strs[j][i]) {
flag = 1;
break; // 无需继续对比其他字符串,直接退出内层循环
}
}
// 若当前字符在所有字符串中均匹配成功,更新公共前缀长度
if (!flag) {
rindex++;
} else {
break; // 若匹配失败,后续字符无需再检查,退出外层循环
}
}
// 边界处理2:若rindex仍为0,说明无任何公共前缀(仅匹配了0个字符),返回空字符串
if (index == rindex) return "";
// 截取公共前缀:从index(0)开始,长度为rindex(匹配成功的字符个数)
string ans = str.substr(index, rindex);
return ans; // 返回最长公共前缀
}
};