最長公共前綴

原題

  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上查看代碼片派生到個人代碼片

  1. public String longestCommonPrefix(String[] strs) {  
  2.          if(strs.length==0) return "";  
  3.          String s=strs[0];  
  4.           for (int i = 1; i < strs.length; i++) {  
  5.                if(s.length()==0||strs[i].length()==0) return "";  
  6.                int len=Math.min(s.length(), strs[i].length());                  
  7.     //上面錯在多加了一個count,可是在實際的時候當"a""b的時候,count爲0 截取的子串仍是「a」  
  8.                int j;  
  9.                for (  j = 0; j <len; j++) {  
  10.                     //這裏不能是==  
  11.                     if (s.charAt(j)!=strs[i].charAt(j))  
  12.                          break;  
  13.                }  
  14.                s=s.substring(0, j);//0到j-1的位置  
  15.           }  
  16.           return s;  
  17.     }  

 

其實作起來會感受很簡單,須要注意的是要考慮效率的問題,畢竟多是很長的字符串數組,因此能夠考慮選取全部字符串中最短的那個來首先進行比較,由於最長公共子串確定不會大於其長度,這樣避免了字符串之間長度差別很大形成的效率損失,而後每次比較以後最長公共子串的長度也永遠不會大於最短的那個字符串,只會不變或減少,只要遍歷字符串數組,挨個對比、更改最短公共字符串記錄便可,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;
相關文章
相關標籤/搜索