LeetCode-14-最长公共前缀

LeetCode-14-最长公共前缀


题意描述:
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""

说明: 所有输入只包含小写字母 a-z 。


示例:

示例1:

输入: ["flower","flow","flight"]
输出: "fl"

示例2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

解题思路:
Alice: 我看了LeetCode官方的题解了,各种写法都要,简直良心。
Bob:是啊,里面还有很多人在互相讨论。
Alice: 那你还要继续写吗,别人都已经写过了。
Bob: 要写,别人写出来是别人的,只有自己写出来了,经历了,思考了才是自己的。可以学习别人的,但是也要有自己的。
Alice: 看来直接比较每一列的字符是最常见的了,首先求得最短字符串的长度,然后按照这个长度去遍历每一列。如果每一列的字符都相等,就是前缀中的字符,否则就要停止了。
Bob: 是的,我用Python写的话,直接用了set,把第j列所有的字符取出来set,一下,如果集合的长度是1,就说明只有一个字符,就是前缀之一。
Alice: 应该不用求最短的字符串长度吧,就在比较的过程中加一个if应该也可以。
Bob: Σ(っ°Д°;)っ好---------------------------厉---------------------------------害!
Alice: 你要加油了!!小老弟


代码:

Python 方法一 :

    def longestCommonPrefix(self, strs: List[str]) -> str:
        if len(strs) == 0:
            return ""
        boundary = min([len(x) for x in strs])     // 找到所有字符串中的最小长度值
        prefix = ""             
        for x in range(boundary):                  // 最长的长度就是boundary
            temp = set([y[x] for y in strs])       // 取出所有字符串的第x个字符
            if len(temp) == 1:                     // 都是一个字符,加入到前缀
                prefix += temp.pop()
            else:
                return prefix
        return prefix
                

Python 方法一 + 一点点优化。 其实不必寻找到长度最小的字符串,任一的字符串长度都可以,在比较的过程中总会遇到那个长度最短的字符串的,这样就把两次遍历减少到了一次遍历。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if len(strs) == 0:
            return ""
        boundary = len(strs[0])                        
        prefix = ""
        for x in range(boundary):
            tmp = []
            for y in strs:
                if len(y) <= x:                       
                    return prefix 
                else:
                    tmp.append(y[x])
            tmp = set(tmp) 
            if len(tmp) == 1:
                prefix += tmp.pop()
            else:
                return prefix
        return prefix

Java 方法一:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0){
            return "";
        }else{
            int minLength = strs[0].length();
            for(int i=0; i<strs.length; ++i){
                if(minLength > strs[i].length()){
                    minLength = strs[i].length();
                }
            }
            //System.out.println(minLength);
            String answer = "";
            for(int i=0; i<minLength; ++i){
                String prefix = strs[0].substring(0, i+1);
                for(int j=1; j<strs.length; ++j){
                    if(!prefix.equals(strs[j].substring(0, i+1))){
                        return answer;
                    }
                    //System.out.println(answer);
                }
                answer =  prefix;
            }
            return answer;
        }
    }
}

c++ 方法一:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size() == 0){
            return "";
        }else{
            int minLength = strs.at(0).length();
            for(int i=0; i<strs.size(); ++i){
                if(minLength > strs.at(i).length()){
                    minLength = strs.at(i).length();
                }
            }
            //cout << minLength << endl;
            string answer = "";
            for(int i=0; i<minLength; ++i){
                string prefix = strs.at(0).substr(0, i+1);
                for(int j=1; j<strs.size(); ++j){
                    if(prefix != strs.at(j).substr(0, i+1)){
                        return answer;
                    }
                }
                answer = prefix;
            }
            return answer;        // 此处必须是answer 而不能是"", 针对["a"]的情况。
        }
    }
};

易错点:

一些样例数据:

[]
['', '', '']
['a']

总结:

花式解题的官方题解,起来学习啦。


你可能感兴趣的:(#,LeetCode小花园)