Leetcode 14. 最長公共前綴

歡迎經過語雀主頁查看 Leetcode 14. 最長公共前綴

題目描述

編寫一個函數來查找字符串數組中的最長公共前綴。java

若是不存在公共前綴,返回空字符串 ""。 算法

示例 1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例 2: 輸入: ["dog","racecar","car"] 輸出: "" 解釋: 輸入不存在公共前綴數組

說明: 全部輸入只包含小寫字母 a-z 。app

思路

思路1:兩兩取公共前綴

每次取2個字符串,得到公共前綴。而後把公共前綴再次當作新的字符串放入數組,進行比較。直到數組中只剩下一個字符串時,該字符串就是最長公共前綴。函數

代碼
public String longestCommonPrefix(String[] strs) {
    if (strs.length == 0) {
        return "";
    }
    if (strs.length == 1) {
        return strs[0];
    }

    // 此處爲了方便,使用了LinkedList
    LinkedList<String> linkedList = new LinkedList<>();
    for (String str : strs) {
        linkedList.addFirst(str);
    }
    return longestCommonPrefix(linkedList);
}

private String longestCommonPrefix(LinkedList<String> linkedList) {
    while (linkedList.size() > 1) {
        // 取出2個字符串
        String s1 = linkedList.removeFirst();
        String s2 = linkedList.removeFirst();

        // 獲取公共前綴
        StringBuilder commonPrefix = new StringBuilder();
        for (int i = 0; i < s1.length() && i < s2.length(); i++) {
            if (s1.charAt(i) == s2.charAt(i)) {
                commonPrefix.append(s1.charAt(i));
            } else {
                break;
            }
        }
        
        // 公共前綴加入數組
        linkedList.addLast(commonPrefix.toString());
    }

    return linkedList.get(0);
}

該方法的時間複雜度是(O2), 雖然比暴利破解O(n3)的解法好,可是依舊不夠完美。ui

思路2:排序

將字符串排序,而後取第一個字符串和最後一個字符串的公共前綴便可。(排序算法直接使用庫函數,得到最優的排序時間複雜度)code

代碼
public String longestCommonPrefix(String[] strs) {
   if (strs.length == 0) {
       return "";
   }
   if (strs.length == 1) {
       return strs[0];
   }

   // 排序
   Arrays.sort(strs);
   String s1 = strs[0];
   String s2 = strs[strs.length - 1];
   StringBuilder commonPrefix = new StringBuilder();
   for (int i = 0; i < s1.length() && i < s2.length(); i++) {
       if (s1.charAt(i) == s2.charAt(i)) {
           commonPrefix.append(s1.charAt(i));
       } else {
           break;
       }
   }
   return commonPrefix.toString();
}
相關文章
相關標籤/搜索