【被OJ毒打的第五天】LeetCode_简单_14.最长公共前缀
点此去做
题干:
编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串 ""
提示:
所有输入只包含小写字母 a-z(还包含空数组!)
输入:
["hxwnb", "hxwsb", "hxwaizzn"]
["zzn", "lxc", "lmy"]
输出:
"hxw"
""
1.我的做法
执行用时:0ms~8ms,8.8MB(NB啊兄弟!!!)
思想:因为要寻找对于全部字符串都共有的部分,实际上拿最短的字符串做基准就可以了。但是数组是未排序的,进行排序要多写一个循环,是不划算的。所以直接对第一个字符串进行索引遍历,当当前索引等于数组中某个字符串的长度时,恰好说明最短的字符串已经被遍历完毕了,此时可以直接返回
实现:两层循环,一层是对 0 ~ strs[0].length() 的字符索引循环,一层是对 1 ~ strs.size() 的除首个外其他所有字符串的循环;当当前索引大于等于数组中某个字符串的长度时,或当前索引位置上不是所有字符串的字符都相等时,都直接 return res。如果程序撑过了第二层循环,说明当前索引位置上所有字符串的字符都相等,故将其连接到 res 上。不要忘了,第一层循环结束也要加上 return 语句
踩坑:虽然 LeetCode 上说输入只有小写字母,但是用例居然有一个 [] !骗子!!!
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0) {
return "";
}
string res = "";
for(int i = 0; i < strs[0].length(); i++) {
for (int j = 1; j < strs.size(); j++) {
if (i >= strs[j].length()) {
return res;
}
if (strs[j][i] != strs[0][i]) {
return res;
}
}
res += strs[0][i];
}
return res;
}
看了看其他执行时间 4ms- 的代码的思路,基本上跟我差不多(开心)~
其实一开始是有想用 8ms 的代码示例中使用的,用一个 flag 记录当前索引位置上是否全部字符串的字符都相等,但是经过之前几天的练习和感悟,这种都是不必要的!
当遇到“不满足某个条件时执行特殊过程”时,完全可以在 if 里直接 break 或者 return,额外使用一个变量记录往往是不必要的!
今天的 OJ 很成功啊!掌声鼓励!!!