1. 程式人生 > >Leetcode __14. 最長公共字首

Leetcode __14. 最長公共字首

問題描述

編寫一個函式來查詢字串陣列中的最長公共字首。

如果不存在公共字首,返回空字串 “”。

示例 1:

輸入: [“flower”,“flow”,“flight”] 輸出: “fl” 示例 2:

輸入: [“dog”,“racecar”,“car”] 輸出: “” 解釋: 輸入不存在公共字首。 說明:

所有輸入只包含小寫字母 a-z 。

解題思路

  • 首先是邊界值的考慮,除了引數判斷外,這裡如果有一個元素的長度為0,則直接返回“”,不需要再判斷,這是容易疏忽的一點
  • 然後拿最小長度的元素遍歷,這樣就不會出現陣列越界
  • 遍歷最小長度,取第一個元素分別與其他元素做比較,從第一位開始,比較到最小長度為止
  • 比較中,如果不相同則直接返回結果,相同的,在外層,也就是遍歷元素最小長度層記錄值即可,(最小長度,就是比較元素的個數,這裡用StringBuileder會更快)

實現

public class LongestCommonPrefix {
    public String longestCommonPrefix(String[] strs) {
        if(strs==null||strs.length==0){
            return "";
        }
        int len = strs[0].length();
        for(String s:strs){
            len = Math.min(len,s.length());
        }
        if(len ==0){
            return "";
        }
        StringBuilder stringBuilder = new StringBuilder(len);
        for(int i=0;i<len;i++){//第一個元素各個字母
            for(int j=1;j<strs.length;j++){//元素個數
                if(strs[0].charAt(i)!=strs[j].charAt(i)){
                    return stringBuilder.toString();
                }

            }
            stringBuilder.append(strs[0].charAt(i));
        }
        return stringBuilder.toString();

    }
}

別人更優美的程式碼


    public static String longestCommonPrefix1(String[] strs) {
        int count = strs.length;
        String prefix = "";
        if(count != 0){
            prefix = strs[0];
        }
        for(int i=0; i<count; i++){
            //關鍵程式碼,不斷的從後往前擷取字串,然後與之相比,直到startsWith()返回true
            while(!strs[i].startsWith(prefix)){
                prefix = prefix.substring(0, prefix.length()-1);
            }
        }
        return prefix;
    }

描述: {“flower”,“flow”,“flight”}; 取第一個元素為基準值flower,遍歷陣列長度,第一個的時候flower是以flower開頭,遍歷下一個,flow不是以flower開頭,則把flower截斷1位,為flowe,再判斷直到變為flow,遍歷下一個元素,flight不是以flow開頭,截斷一位,直至fl,for遍歷結束,返回結果。 很巧妙。