LeetCode 0014

来源:互联网 发布:好用的网络电话软件 编辑:程序博客网 时间:2024/09/21 06:34

原题链接

这题要求的是,所有字符串的公共前缀,并且这个公共前缀是最长的,比如”abc”和”ab”,”a”是这两个字符串的公共前缀,”ab”也是,但是由于”ab”更长,因此返回是”ab”。

我的思路:

直接暴力求解就好了,其中再加一点优化

class Solution {public:    string longestCommonPrefix(vector<string>& strs) {        int size = strs.size();        if(size == 0) {            return "";        }        string cmp_str = strs[0];        int len = cmp_str.size();        int j = len;        for(int i = 1; i < size; i++) {            len = len < strs[i].size() ? len : strs[i].size();            for(j = 0; j < len; j++) {                if(cmp_str[j] != strs[i][j]) {                    break;                }            }            len = j;        }        return cmp_str.substr(0, j);    }};

速度最快的解法:

class Solution {public:    string longestCommonPrefix(vector<string>& strs) {        int size = strs.size(), j = 0;        string result;        if (strs.empty())            return result;        while (1) {            for (int i = 1; i < size; i++) {                if (j >= strs[i].length() || strs[i][j] != strs[0][j]) {                    return result;                        }            }            result += strs[0][j];            j++;            if (j >= strs[0].length())                return result;        }        return result;    }};

这种做法的思路是,把长度从1开始试,如果前面的长度都能使得所有的字符串取相同的前缀,而这个长度不行,那么答案就出来了,而我的做法是,把第一个与剩余所有的字符串进行比较,再利用已有的结论——最长公共前缀的长度一定小于等于当前的最长公共前缀的长度,也一定小于等于某个字符串的长度——进行一些优化,如果不优化的话会更糟糕。

我来构造这么一个例子

for(int i = 0; i < n; i++) {  string str = "";  for(int j = 0; j < n - i; j++) {    str += "a";  }  strs.add(str);}

用我的做法应该是(n1)+(n2)++1次,也就是n(n1)2

而最佳答案的做法约为2n

原创粉丝点击