回顾用的,原题链接:. - 力扣(LeetCode)
编写一个函数来查找字符串数组中的最长公共前缀
如果不存在公共前缀,返回空字符串 ""
。
示例
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) { // 检查字符串数组是否为空
return "";
}
for (int i = 0; i < strs[0].length(); i++) {
char c = strs[0][i];
for (int j = 1; j < strs.size(); j++) {
if (i == strs[j].length() || strs[j][i] != c) {
return strs[0].substr(0, i);
}
}
}
// 如果所有字符都匹配,则返回第一个字符串(它本身就是公共前缀)
return strs[0];
}
};
假设我们有以下的字符串数组:
cpp复制代码
vector<string> strs = {"flower", "flow", "flight"}; |
现在,我们调用longestCommonPrefix(strs)
函数来找出这个数组中的最长公共前缀。
初始化:
- 外层循环变量
i
初始化为0,表示我们即将检查strs[0]
(即"flower")的第一个字符。
外层循环:
当i = 0
时:
- 我们取
strs[0]
的第一个字符c
,即'f'。
内层循环:
- 从
strs
的第二个字符串开始(索引为1),我们检查"flow"的第一个字符,它是'f',与c
('f')相同。 - 接着检查"flight"的第一个字符,它也是'f',与
c
('f')相同。
结果:
- 因为所有检查的字符串的第一个字符都与
c
相同,内层循环结束,没有返回任何结果。
继续外层循环:
i
增加为1,我们取strs[0]
的第二个字符c
,即'l'。
内层循环(再次):
- 检查"flow"的第二个字符,它是'l',与
c
('l')相同。 - 检查"flight"的第二个字符,它也是'l',与
c
('l')相同。
结果:
- 内层循环结束,没有返回任何结果。
继续外层循环:
- 这个过程会继续,直到我们找到不同的字符或者已经检查了
strs[0]
的所有字符。
找到不同:
- 当
i = 2
时,我们取strs[0]
的第三个字符c
,即'o'。 - 检查"flow"的第三个字符,它是'w',与
c
('o')不同。
结果:
- 在这一步,我们找到了不同,因此函数会返回
strs[0].substr(0, i)
,即"fl"。
返回结果:
- 函数返回"fl",这是数组
strs
中的最长公共前缀。
备注:
- 如果在遍历完
strs[0]
的所有字符后都没有找到不同的字符,那么strs[0]
本身就是所有字符串的最长公共前缀,函数会直接返回strs[0]
。但在我们的例子中,这并没有发生。
总结:
- 通过逐步比较和检查数组中的每个字符串的对应字符,
longestCommonPrefix
函数能够找到并返回最长公共前缀。