The Night Day最长公共前缀

class Solution(object):
    """
    编写一个函数来查找字符串数组中的最长公共前缀。

    如果不存在公共前缀,返回空字符串 ""。
    
    示例 1:
    输入: ["flower","flow","flight"]
    输出: "fl"
    
    示例 2:
    输入: ["dog","racecar","car"]
    输出: ""
    解释: 输入不存在公共前缀。
    
    说明:
    所有输入只包含小写字母 a-z 。
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-common-prefix
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    """

    """
    @author : jiyanjiao
    @date :2020-4-7
    """
    # 基本解法

    list_fist_al = []
    list_als = []
    st = []
    flag = 0  # 当子字符串最小的元素验证后,标记flag跳出循环
    
    def longestCommonPrefix(self, strs):
        """
        将传入的列表中的字符串均变成列表
        :type strs: List[str]
        :rtype: str
        """
        # 存入新生成的列表
        list_items = []
        for i in range(len(strs)):
            list_item = list(strs[i])
            list_items.append(list_item)
            i += 1
        
        # 获取列表中子列表的第一个字符
        self.list_p(list_items)
        # 判断自列表中的第一个字符是否相同,相同继续循环,取各个自列表的第二个字符
        while len(self.list_set(self.list_als)) != 0:
            self.list_p(list_items)
            if self.flag == 1:
                break
        if len(self.st) != 0:
            print("最大公共字符串为:", ''.join(self.st))
        else:
            print("输入不存在公共前缀")
        
    def list_set(self, lst):
        """
        判断列表中的元素是否是一样的
        :param lst:
        :return:
        """
        for i in range(len(lst)-1, len(lst)):
            # 使用set集合去重,如果有唯一的元素证明整个列表元素相同
            list_set = set(lst[i])
            if len(list_set) == 1:
                self.st.append(lst[i][0])
            else:
                break
            i += 1
        return self.st

    def list_p(self, list_items):
        """
        使用队列开始比较列表中的第一个字符
        :param list_items:
        :return:
        """
        self.list_fist_al = []
        for i in range(len(list_items)):
            # 将每轮的第一个字符存入到一个列表中
            self.list_fist_al.append(list_items[i].pop(0))
            if len(list_items[i]) == 0:
                self.flag = 1
                break
            i += 1
        # 将每轮循环的第一个字符列表在加入一个列表中
        self.list_als.append(self.list_fist_al)
        return self.list_als

注:以上是从功能层面实现了(思路是对的),后来参考其他作者挖掘出python的一个函数直接搞定那就是zip,让我们一起看一下实现的代码吧
  
 """
    思路二:
        zip(*st rs)函数将列表变换成元组。然后使用集合set的互异性,判断set后的元组⻓度等于1,等于1则认为该字符是公共前缀,加入公共前缀字符串
        
        作者:jixiang_1
        链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/liang-chong-si-lu-qiu-jie-by-jixiang_1/
        来源:力扣(LeetCode)
        著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    """
    """
        zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
    
        如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
    """
    def longestCommonPrefix1(self, strs):
        s = ""
        for i in zip(*strs):
            if len(set(i)) == 1:
                s += i[0]
            else:
                break
        print(s)
        return s

 

if __name__ == '__main__':
    s = Solution()
    ls_n = ["dog", "racecar", "car"]
    ls = ["flower", "flow", "flight", "fly"]
    s.longestCommonPrefix(ls)
    

 

posted @ 2020-04-07 14:37  jiyanjiao  阅读(129)  评论(0编辑  收藏  举报