1. 程式人生 > >leetcode 14. 最長公共字首

leetcode 14. 最長公共字首

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

如果不存在公共字首,返回空字串 ""

示例 1:

輸入: ["flower","flow","flight"]
輸出: "fl"

示例 2:

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

說明:

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

分析:找到陣列中長度最小的元素min(從後面更快的例子來看,這個好像不需要~),然後從min的第一字元開始,去查詢剩餘元素是否在相同位置是同一個字元。

程式碼實現:

public static String longestCommonPrefix(String[] strs) {
		if (strs.length == 0) {  //如果陣列中沒有元素
			return "";
		} else {
			String min = strs[0];    //找出長度最小的元素
			for (int i = 1; i < strs.length; i++) {
				if (strs[i].length() < min.length()) {
					min = strs[i];
				}
			}
			StringBuilder result = new StringBuilder();  //定義結果變數result
			int length = min.length();
			for (int i = 0; i < length; i++) {  //從min的第一個字元開始
				int j;
				for (j = 0; j < strs.length; j++) {  //判斷剩餘元素在相同位置是否是同一字元
					if (min.charAt(i) != strs[j].charAt(i)) {
						return result.toString();
					}
				}
				if (j == strs.length) {  //剩餘元素在同一位置與min具有相同字元
					result.append(strs[0].charAt(i));
				}

			}
			return result.toString();
		}
	}

第一次程式碼執行時間為26ms。

改進版:

public static String longestCommonPrefix(String[] strs) {
        if(strs.length == 0){  //陣列中沒有元素
            return "";
        }
        String prefix = strs[0];  //取第一個元素(不一定長度最短),作為最開始的字首prefix
        for (int i = 1; i < strs.length; i++) { //從陣列的第二個元素開始
            while (strs[i].indexOf(prefix) != 0) {  //如果第i個元素的從第一字元開始(即它的字首)沒有包括這字首
                prefix = prefix.substring(0, prefix.length() - 1);  //字首去掉最後一個字元
                if (prefix.length() == 0) { //當前綴的字元全部去掉之後
                    return "";
                }
            }
        }
        return prefix;
    }

第二次程式碼的執行時間為5ms