Longest Common Prefix
Solution
暴力算法,逐个位置的进行子串比对,出现不完全匹配的情况,在当前的位置终止,最长公共前缀即为当前位置之前的子串。我觉得这个题可能让练习二分搜索(从长度枚举上改进)以及前缀树(存储上的改进),但是实际上暴力遍历反而是最有效的,有点达到了DP的效果。
- 时间复杂度: O ( l e n M i n × n ) O(lenMin \times n) O(lenMin×n),其中 l e n M i n lenMin lenMin表示所有字串的最小长度(最坏情形), n n n表示输入的字串个数
- 空间复杂度: O ( 1 ) O(1) O(1),仅需要保存当前位置的比对字符
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0) {
return "";
}
int lenMin = 300;
for (auto str: strs) {
lenMax = min(lenMax, int(str.size()));
}
int lenComMax = 0;
for (int i = 0; i < lenMin; ++i) {
bool flag = true;
char cCom = strs[0][i];
for (auto str: strs) {
if (str[i] != cCom) {
flag = false;
break;
}
}
if (flag) {
lenComMax ++;
}
else {
break;
}
}
return strs[0].substr(0, lenComMax);
}
};
Solution 2
Solution 1的Python实现,略微调整了一下冗余的逻辑。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ""
lenMin = 300
for str in strs:
lenMin = min(len(str), lenMin)
if lenMin == 0:
return ""
for i in range(lenMin) :
for str in strs:
if str[i] != strs[0][i]:
return str[: i]
if i == lenMin - 1:
return str[: lenMin]