题目:
Write a function to find the longest common prefix string amongst an array of strings.
题目大意:
写一个函数,求一个字符串数组中最长的公共前缀子串。
思路:
在做这道题之前先要了解一下什么叫做公共前缀子串。在英语中一个单词可以分为前缀、词根、后缀三部分,所谓前缀就是指在单词的开头处的一个或几个字符。相应的,字符串的前缀子串就是指字符串从第一个字符算起的一个或某几个字符,比如:abcdef和abcedf的最长公共前缀子串是abc而abcdef和bbcdef的最长公共前缀子串是空字符串,切不可以为是bcd。具体思路如下:
1、如果为空,直接返回空字符串
2、寻找数组中最小长度的字符串,防止越界
3、以最小长度的字符串为外循环(因为最长的公共前缀不会长于最小长度的字符串),每次检查所有的字符串是否相等,如果有一个不相等则已经没有必要再检查下去,直接返回结果字符串,如果都相等则将本次扫描的字符加在结果串上。
代码:
class Solution {
public:
std::string longestCommonPrefix(std::vector<std::string>& strs) {
//如果为空,直接返回空字符串
if (strs.size() == 0) {
return "";
}
std::string result = "";
//寻找最小长度的字符串,防止越界
auto minSize = strs[0].size();
for (auto &a : strs) {
if (a.size() < minSize) {
minSize = a.size();
}
}
//以最小长度的字符串为外循环(因为最长的公共前缀不会长于最小长度的字符串)
//每次检查所有的字符串是否相等
for (int i = 0; i < minSize; ++i) {
for (int j = 0; j + 1 < strs.size(); ++j) {
if (strs[j][i] != strs[j + 1][i]) { //如果有一个不相等则已经没有必要再检查下去
return result;
}
}
result += strs[0][i]; //如果都相等则将本次扫描的字符加在结果串上
}
return result;
}
};