Leetcode - 最长公共前缀

132 阅读1分钟

这是我参与更文挑战的第15天,活动详情查看更文挑战

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

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

示例 2:

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

提示:

  • 0 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

解题思路

解法一: Python 特性,取每一个单词的同一位置的字母,看是否相同

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        res = ""
        for tmp in zip(*strs):
            tmp_set = set(tmp)
            if len(tmp_set) == 1:
                res += tmp[0]
            else:
                break
        return res

解法二 取一个单词 s,和后面单词比较,看 s 与每个单词相同的最长前缀是多少。遍历所有单词。

class Solution:
    def longestCommonPrefix(self, s: List[str]) -> str:
        if not s:
            return ""
        res = s[0]
        i = 1
        while i < len(s):
            while s[i].find(res) != 0:
                res = res[0:len(res)-1]
            i += 1
        return res

解法三 按字典排序数组,比较第一个,和最后一个单词,有多少前缀相同

class Solution:
    def longestCommonPrefix(self, s: List[str]) -> str:
        if not s:
            return ""
        s.sort()
        n = len(s)
        a = s[0]
        b = s[n-1]
        res = ""
        for i in range(len(a)):
            if i < len(b) and a[i] == b[i]:
                res += a[i]
            else:
                break
        return res

C++版本 如果没有字符串,回空串;如果只有一个字符串,回它本身。

否则,以strs[0]为标准,对它的每一个字符,将剩下的字符串一一比照。如果发现有不够长的,或者字符对不上的,就地结束,返回到目前为止比照合格的子串。

如果strs[0]的全部字符都比照完了,就回它本身。

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if (strs.size() == 0)
            return "";
        if (strs.size() == 1)
            return strs[0];
        
        for (int length = 0; length < strs[0].size(); ++length)
            for (int i = 1; i < strs.size(); ++i)
                if (length == strs[i].size() || strs[i][length] != strs[0][length])
                    return strs[0].substr(0, length);
        return strs[0];
    }
};