14. Longest Common Prefix
一、问题描述
Write a function to find the longest common prefix string amongst an array of strings.
二、输入输出
三、解题思路
二路归并
- 解题思路:如果给你两个字符串,让你找出最大的common prefix 你一定有办法(对吧?)简单说就是取第一个字符串的子串,长度从最长往最短取,也就是在原来的字符串上每次去掉后面的一个字符,然后看第二个字符串前面是否含有这个prefix就可以了。
- 现在题目给了一个字符串数组,我们知道怎么合并两个字符串了,那么仿照二路归并排序的思路,从vector中首尾开始取string 分别进行取prefix 然后每两个合并的结果加到一个新的vector中,递归调用,并给出递归退出条件,即可求出最终结果。这里面用到了一个性质,就是n个string的最大公共前缀一定是任意两个string的最大公共前缀的一部分。
- C++里面判断string是不是以某个prefix开头有多种方法,使用boost可以搞定,另外简单一点的
string prefix = first.substr(0,i+1);if(second.substr(0, prefix.size()) == prefix)return prefix;
感觉是个非常不错的选择。find_first_of是不行的哦。
class Solution {
public:
string findCommonPrefix(const string& first, const string& second)
{
for (int i = first.size()-1; i >= 0; --i) {
string prefix = first.substr(0,i+1);
if(second.substr(0, prefix.size()) == prefix)return prefix;
}
return "";
}
string longestCommonPrefix(vector<string>& strs) {
if(strs.size() == 0)return "";
if(strs.size() == 1)return strs[0];
vector<string> newStrs;
for (int low = 0, high = strs.size()-1; low <= high ; ++low, --high) {
string prefix = findCommonPrefix(strs[low], strs[high]);
newStrs.emplace_back(prefix);
}
return longestCommonPrefix(newStrs);
}
};