美文网首页
Leetcode 14 最长公共前缀

Leetcode 14 最长公共前缀

作者: SunnyQjm | 来源:发表于2020-06-26 11:30 被阅读0次

最长公共前缀

题目

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

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

  • 示例1:

    输入: ["flower","flow","flight"]
    输出: "fl"
    
  • 示例2:

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

解答

  • 解法1:

    • 思路:

      • 将两个字符串转为list;
      • 对两个list进行排序;
      • 然后注意比较对应位置的字符是否相等即可。
    • 代码:

      def isAnagram(self, s1, s2):
          """
          排序对比法
      
          思路:
          1. 将两个字符串转为list;
          2. 堆两个list进行排序;
          3. 然后注意比较对应位置的字符是否相等即可
          """
          # 特判字符串长度不相同的情况
          # 其实这个不是必须的,只是在输入有可能长度不一的情况下,用这个可能可以提高一点性能
          if len(s1) != len(s2):
              return False
          list1 = list(s1)
          list2 = list(s2)
          list1.sort()
          list2.sort()
      
          for i in range(len(list1)):
              if list1[i] != list2[i]:
                  return False
          return True
      
  • 解法2:

    • 思路:

      • 创建两个长度位26的数组;
      • 各自统计两个字符串中每个字符出现的次数;
      • 接着对比两个数组即可。

      ord => python中的一个内置函数,传入一个字符,会返回其对应的ASCII值

    • 代码:

      def isAnagram2(self, s1, s2):
          """
          字符统计对比法(Knowledge)
      
          思路:
          1. 创建两个长度位26的数组;
          2. 各自统计两个字符串中每个字符出现的次数;
          3. 接着对比两个数组即可
      
          PS: ord => python中的一个内置函数,传入一个字符,会返回其对应的ASCII值
          """
          # 特判字符串长度不相同的情况
          # 其实这个不是必须的,只是在输入有可能长度不一的情况下,用这个可能可以提高一点性能
          if len(s1) != len(s2):
              return False
      
          c1 = [0] * 26
          c2 = [0] * 26
      
          # 统计字符出现的次数
          for i in range(len(s1)):
              c1[ord(s1[i]) - ord('a')] += 1
              c2[ord(s1[i]) - ord('a')] += 1
      
          # 对比统计结果
          for i in range(26):
              if c1[i] != c2[i]:
                  return False
      
          return True
      

    测试验证

    class Solution:
        def isAnagram(self, s1, s2):
            """
            排序对比法
    
            思路:
            1. 将两个字符串转为list;
            2. 堆两个list进行排序;
            3. 然后注意比较对应位置的字符是否相等即可
            """
            # 特判字符串长度不相同的情况
            # 其实这个不是必须的,只是在输入有可能长度不一的情况下,用这个可能可以提高一点性能
            if len(s1) != len(s2):
                return False
            list1 = list(s1)
            list2 = list(s2)
            list1.sort()
            list2.sort()
    
            for i in range(len(list1)):
                if list1[i] != list2[i]:
                    return False
            return True
    
        def isAnagram2(self, s1, s2):
            """
            字符统计对比法(Knowledge)
    
            思路:
            1. 创建两个长度位26的数组;
            2. 各自统计两个字符串中每个字符出现的次数;
            3. 接着对比两个数组即可
    
            PS: ord => python中的一个内置函数,传入一个字符,会返回其对应的ASCII值
            """
            # 特判字符串长度不相同的情况
            # 其实这个不是必须的,只是在输入有可能长度不一的情况下,用这个可能可以提高一点性能
            if len(s1) != len(s2):
                return False
    
            c1 = [0] * 26
            c2 = [0] * 26
    
            # 统计字符出现的次数
            for i in range(len(s1)):
                c1[ord(s1[i]) - ord('a')] += 1
                c2[ord(s1[i]) - ord('a')] += 1
    
            # 对比统计结果
            for i in range(26):
                if c1[i] != c2[i]:
                    return False
    
            return True
    
    
    if __name__ == '__main__':
        solution = Solution()
    
        print(solution.isAnagram("heart", "earth"), " == True")
        print(solution.isAnagram("python", "typhon"), " == True")
        print(solution.isAnagram("qwert", "qwertg"), " == False")
    
        print(solution.isAnagram2("heart", "earth"), " == True")
        print(solution.isAnagram2("python", "typhon"), " == True")
        print(solution.isAnagram2("qwert", "qwertg"), " == False")
    

相关文章

网友评论

      本文标题:Leetcode 14 最长公共前缀

      本文链接:https://www.haomeiwen.com/subject/kxnyfktx.html