天天看点

【LeetCode】14.最长公共前缀(简单)【被OJ毒打的第五天】LeetCode_简单_14.最长公共前缀

【被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 很成功啊!掌声鼓励!!!