LEETCODE专题
14. Longest Common Prefix
题目要求:
题目要求我们找到一个字符串数组里的最长共同前缀字符串。
思路:
- 这道题目比较简单,大概思路就是一般情况时我们可以从第1和第2个字符串开始匹配最长共同前缀字符串,再匹配第3和第4个字符串,……以此类推。此外,可以先初始化匹配字符串为第1个字符串,表示第1个字符串与第0个字符串匹配的结果,可以理解为第0个字符串是“万金油”,此后所有的匹配结果都要与上一组的匹配结果进行比较,如果后来的结果长度更长则不改变之前的结果,否则后来匹配的结果覆盖最长匹配字符串并作为下一组匹配的结果的比较字符串。
- 这道题目主要有两个坑(之前笔者没学好string(&…&!))。笔者使用的最长共同前缀字符串prefix的初始化为
string prefix = "";
第一个坑是vector有可能为空,这是后直接返回prefix会产生”reference to nullptr”的错误,应该改为
return "";
此处返回常量字符串的话会自动生成’\0’,免除上述的困扰。
第二个坑就是vector有可能只有一个字符串,此时返回的应该是该字符串。(其实笔者后来该的时候发现是完全可以跳过这个坑的,不过当时脑抽了…)
下面直接上代码:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0) return "";
if (strs.size() == 1) return strs[0];
string prefix = strs[0], temp;
int i, j;
for (i = 0; i < strs.size() - 1; i++) {
j = 0;
if (strs[i + 1].length() == 0) return "";
temp.clear();
while (j < strs[i].length() && j < strs[i + 1].length() && strs[i][j] == strs[i + 1][j]) {
temp += strs[i][j++];
}
if (temp.length() < prefix.length()) prefix = temp;
}
return prefix;
}
};
时间复杂度:O(nm)