您的位置:首页 > 其它

14. Longest Common Prefix

2015-06-29 19:12 162 查看
这道题目比较常规和简单,我的算法是先计算出字符串数组中最短的那个字符串的长度maxCommLen,然后从后往前扫,变量cnt+1记录目前探测到的最长字符串的长度,如果遇到了一个非共同字符,则更新变量cnt。后来想了一下,这样写代码比较复杂,需要维护cnt这个变量,而且遍历次数会变多。参考了一下别人的代码,其实从前向后扫,更直观,效率也更好。无论是从后向前还是从前向后,时间复杂度都是O(N*M),其实N为字符串数组中字符串的数量,M为字符串数组中最短的那个字符串的长度。

从后向前扫的代码如下:

string longestCommonPrefix(vector<string>& strs) {

if (strs.size() == 0) {
return "";
}

int i, j, len = (int)strs.size(), maxCommLen = INT32_MAX, cnt = 0;
bool ifEqual = true;
for (i=0; i<len; i++) {
if (maxCommLen > strs.at(i).size()) {
maxCommLen = (int)strs.at(i).size();
}
}
cnt = maxCommLen-1; // cnt记录最长公共前缀的最后一个字符的下标
for (i=maxCommLen-1; i>=0; i--) {
if (!ifEqual) { // 如果遇到非公共字符,则更新cnt
cnt = i;
ifEqual = true;
}
char tmp = strs.at(0).at(i);
for (j=1; j<len; j++) {
if (strs.at(j).at(i) != tmp) {
break;
}
}
if (j != len) {
ifEqual = false; // 遇到了非公共字符,将ifEqual赋值为false
}

}
if (ifEqual) {
return strs.at(0).substr(0, cnt+1);
} else {
return "";
}
}


从前往后扫更直观和简便,代码如下:

class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {

if (strs.size() == 0) {
return "";
}

int i, j, len = (int)strs.size(), maxCommLen = INT32_MAX, prefixLen = 0;
string result;
char c;
for (i=0; i<len; i++) {
if (maxCommLen > strs.at(i).size()) {
maxCommLen = (int)strs.at(i).size();
}
}
for (i=0; i<maxCommLen; i++) {
for (j=0; j<len; j++) {
if (j == 0) {
c = strs.at(j).at(i);
continue;
}
if (c != strs.at(j).at(i)) {
return strs.at(j).substr(0, i); // 碰到一个非公共字符串可以立即返回
}
}
prefixLen++; // 记录公共前缀长度
}
return strs.at(0).substr(0, prefixLen);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: