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,可能是服務器端捕獲了錯誤,然後直接給報錯了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章