Leetcode __14. 最長公共字首
阿新 • • 發佈:2018-12-18
問題描述
編寫一個函式來查詢字串陣列中的最長公共字首。
如果不存在公共字首,返回空字串 “”。
示例 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遍歷結束,返回結果。 很巧妙。