Leet Code 14 Longest Common Prefix

来源:互联网 发布:tensorflow 微调模型 编辑:程序博客网 时间:2024/05/17 02:54

Write a function to find the longest common prefix string amongst an array of strings


【算法思路】

1. 找最短的一个串,然后与其他串每个字符比较


public String longestCommonPrefix(String[] strs) {        if(strs.length == 0)            return "";        if(strs.length == 1)            return strs[0];        int minLen = strs[0].length();        int minIndex = 0;        for (int i = 0; i < strs.length; i ++)        {            if (strs[i].length() < minLen)            {                minLen = strs[i].length();                minIndex = i;            }        }                StringBuilder sb = new StringBuilder("");                for(int i = 0; i < minLen; i ++)        {            int flag = 0;            for(int j = 0; j < strs.length; j ++)            {                if(strs[j].charAt(i) != strs[minIndex].charAt(i))                {                    flag = 1;                    break;                }            }                        if(flag == 0)            {                sb.append(strs[minIndex].charAt(i));            }            else            {                return sb.toString();            }        }                return sb.toString();    }


【CODE V2】

public String longestCommonPrefix(String[] strs) {    if(strs == null || strs.length == 0)        return "";     int minLen=Integer.MAX_VALUE;    for(String str: strs){        if(minLen > str.length())            minLen = str.length();    }    if(minLen == 0) return "";     for(int j=0; j<minLen; j++){        char prev='0';        for(int i=0; i<strs.length ;i++){            if(i==0) {                prev = strs[i].charAt(j);                continue;            }             if(strs[i].charAt(j) != prev){                return strs[i].substring(0, j);            }        }    }     return strs[0].substring(0,minLen);}



【复杂度】

时间:O(N^2)

空间:O(N)


2. 遍历字符串数组,每次用当前prefix和下一个字符串匹配以生成新的prefix。

[Code]

1:    string longestCommonPrefix(vector<string> &strs) {  2:      // Start typing your C/C++ solution below  3:      // DO NOT write int main() function  4:      string compare;  5:      if(strs.size() == 0) return compare;  6:      compare = strs[0];  7:      for(int i =1; i< strs.size() ; i++)  8:      {  9:        string prefix;  10:        int k =0;  11:        while(k< compare.size() && k< strs[i].size())  12:        {  13:          if(compare[k] != strs[i][k])  14:            break;  15:          prefix.append(1, compare[k]);  16:          k++;  17:        }  18:        compare.clear();  19:        compare.append(prefix.c_str());        20:      }  21:      return compare;  22:    }  


3. 对于每一个字母比较所有字符串,直到遇到任何一个不匹配。这个时间复杂度比上一个解法好一些,避免了不必要的比较。

  string longestCommonPrefix(vector<string> &strs) {  2:            string prefix;  3:            if(strs.size() ==0) return prefix;  4:            int len =0;  5:            while(1)  6:            {  7:                 char var;  8:                 int i=0;  9:                 for(; i< strs.size(); i++)  10:                 {  11:                      if(i ==0) var =strs[0][len];  12:                      if(strs[i].size() == len || var != strs[i][len])  13:                      break;  14:                 }  15:                 if(i!= strs.size())  16:                      break;                 17:                 len++;  18:                 prefix.append(1, var);  19:            }  20:            return prefix;  21:       }  

0 0
原创粉丝点击