Skip to main content

0014 - Longest Common Prefix

大意說明

找出一組字串陣列中,相同字串的部份。

例如 ["flower","flow","flight"] 的結果是 fl["dog","racecar","car"] 的結果是空字串(沒有相同的部份)

解題思路

想不到,所以參考了答案

首先先做字串 list 的排序,原因是字串經過排序之後,一定是由各字串的字母一路排上去,所以最不一樣的肯定在最後面,這樣就可以把比較範圍縮小(也比較不會不知所措)

接著就是第一個字串跟最後一個字串比較,然後用長度最小的字串長度當作迴圈結束條件之一

如果比到一半發現字元不同,直接跳掉。否則就繼續加入字串,直到結束條件達成為止。

程式碼如下:

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """

        result = ""
        
        # 依照字串字母順序排序,最不一樣的一定在最後面
        sorted_list = sorted(strs)
        
        first = sorted_list[0]
        last = sorted_list[-1]

        for i in range(0, min(len(first), len(last))):
            if first[i] != last[i]:
                return result
            result += first[i]
        
        return result

這邊反而鼓勵使用程式語言內建排序方式,Python 的話就是 sorted() ,Java 的話是 Array.sort()

以下是 Java code:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        ArrayList<String> arraylist = new ArrayList<>(Arrays.asList(strs));
        arraylist.sort(Comparator.naturalOrder());

        StringBuilder samePart = new StringBuilder();

        String first = arraylist.getFirst();
        String last = arraylist.getLast();
        int count = 0;
        
        while(count < Math.min(first.length(), last.length())){
            if(first.charAt(count) == last.charAt(count)){
                samePart.append(first.charAt(count));
            } else {
                return samePart.toString();
            }
            count++;
        }

        return samePart.toString();
    }
}