leetcode刷题笔记之最长共同前缀

Edit

leetcode刷题笔记之最长共同前缀

题目信息

地址:https://oj.leetcode.com/problems/longest-common-prefix/

题目要求

给定一个字符串列表,找出其最长共同前缀,如['ab', 'abc','abcd']的共同前缀为'ab'

我的解答

import unittest

class Solution:
    # @return a string
    def longestCommonPrefix(self, strs):
        if len(strs) == 1:
            return strs[0]
        from itertools import count
        for i in count():
            try:
                assert eval('=='.join([repr(s[:i+1]) for s in strs]))
            except AssertionError, IndexError:
                break
        return strs[0][:i]

class SolutionTest(unittest.TestCase):
    test_map = [
        ([''], ''),
        (['abc'], 'abc'),
        (['ab', 'abc','abcd'], 'ab'),
        (['', 'abc', 'ab'], ''),
        (['a', 'abc', 'abd', 'abe'], 'a'),
    ]
    def make_test(strs, prefix):
        def func(self):
            s = Solution()
            self.assertEquals(prefix, s.longestCommonPrefix(strs))
        return func

    for i, (j, k) in enumerate(test_map, 1):
        locals()['test_case_%d' % i] = make_test(j, k)

if __name__ == '__main__':
    unittest.main()

思路解析

  1. 此处最主要的困难在于判断最短的字符串长度以避免取字串子串时发生下标越界错误,另一个是判断所有字符串的特定长度子串是否相等。
  2. 第一个问题采用了先试再捕捉错误的思路,避免了先遍历字符串求长度的做法。写起来比较简洁。
  3. 第二个问题采用了eval语句来解决。将所有的子串用==连接,再用eval求值,写起来比循环再一个个判断更简洁。
  4. 虽然本地环境下通过了unittest,但提交代码会报Compile Error,可能是服务器端捕获了错误,然后直接给报错了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章