LeetCode-最长公共前缀
最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
题解,暴力解决,其他方法还没有想到。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
// 暴力解决
int size = strs.size(); // 获取整个vector字符串的个数
if(size == 0) return "";
int len_shortest_str = 0x7FFFFFFF; // 初始假设最短的字串是int型的最大值
int i, j;
for(i = 0; i < size; i++) // 获取最短字符串的长度
if(strs[i].length() < len_shortest_str)
len_shortest_str = strs[i].length();
for(i = 0; i < len_shortest_str ;i++){ // 比较每个单词的第i位
for(j = 1; j < size; j++){
if(strs[j][i] != strs[0][i])
break;
}
if(j != size)
break;
}
//string result(strs[0], 0, i);
return strs[0].substr(0, i);
}
};
补充
分治解法,只为更加熟练分治
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
// 分治解法,只为更加熟练
if(!strs.size()) return "";
return longestCommonPrefix(strs, 0, strs.size() - 1);
}
string longestCommonPrefix(vector<string>& strs, int start, int end){
if(start == end)
return strs[start];
int mid = (start + end) / 2;
string left = longestCommonPrefix(strs, start, mid); // 获取左边的字符串集
string right = longestCommonPrefix(strs, mid + 1, end); // 获取右边的字符串集
return getCommonPrefix(left, right); // 获取两个字符串的公共前缀
}
string getCommonPrefix(string left, string right){ // 获得两个字符串的公共前缀
int minLen = min(left.size(), right.size());
for(int i = 0; i < minLen; i++)
if(left[i] != right[i])
return left.substr(0, i);
return left.substr(0, minLen);
}
};
遇到的问题:
暴力解法中
- 访问字符串’\0’后的单元报错。一开始没有获得最短字符串的长度,导致访问了字符串’\0’后面单元。
- 字符串的截取,一开始我用构造函数获取字串。
string result(strs[0], 0, i);
return result;
但是有更简单的:
return strs[0].substr(0, i);
分治解法中
- 为什么调用longestCommonPrefix(strs, 0, strs.size() - 1);的参数要strs.size() - 1?,这个问题我一下子还有点懵,因为size是vectorstrs中字符串的个数,size是从1开始计数的。而strs下标是从0开始计数的。