Write a function to find the longest common prefix string amongst an array of strings.java
寫一個函數找出一個字串所數組中的最長的公共前綴。算法
第一步先找出長度最小的字符串,而後將這個字符串與其它的字符串相比找出最短的最公共前綴。數組
public class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null) { return null; } if (strs.length == 0) { return ""; } int min = Integer.MAX_VALUE; // 記錄最短的字符串的長度 // 找短字符串的長度 for (String str : strs) { if (str == null) { return null; } if (min > str.length()) { min = str.length(); } } int i; // 記錄最長前綴的字符數 boolean flag; for (i = 0; i < min; i++) { flag = true; for (int j = 1; j < strs.length; j++) { if (strs[0].charAt(i) != strs[j].charAt(i)) { flag = false; break; } } if (!flag) { break; } } // if (i == 0) { // return null; // } return strs[0].substring(0, i); } }
有點相似冒泡算法,每次都要找最小的串的長度,而後進行截取,代碼以下app
[java] view plain copy函數
其實作起來會感受很簡單,須要注意的是要考慮效率的問題,畢竟多是很長的字符串數組,因此能夠考慮選取全部字符串中最短的那個來首先進行比較,由於最長公共子串確定不會大於其長度,這樣避免了字符串之間長度差別很大形成的效率損失,而後每次比較以後最長公共子串的長度也永遠不會大於最短的那個字符串,只會不變或減少,只要遍歷字符串數組,挨個對比、更改最短公共字符串記錄便可,code以下:spa
string s = ""; if(strs.empty()) return s; int len = strs.size(); int sLen = 0; int i=0, j=0; for(i=0; i<len; i++) { if(sLen < strs[i].size()) { s = strs[i]; sLen = strs[i].size(); } } for(i=0; i<len; i++) { for(j=0; j<sLen; j++) { if(s[j] != strs[i][j]) break; } s = s.substr(0, j); sLen = s.size(); } return s;