Java
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0)return "";
//公共前缀比所有字符串都短,随便选一个先
String s=strs[0];
for (String string : strs) {
while(!string.startsWith(s)){
if(s.length()==0)return "";
//公共前缀不匹配就让它变短!
s=s.substring(0,s.length()-1);
}
}
return s;
}
}
C++20中的starts_with,暂时还没有合适的编译器能编译通过
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)return "";
//公共前缀比所有字符串都短,随便选一个先
string s=strs[0];
for (string string : strs) {
while(!string.starts_with(s)){// C++20里面的
if(s.length()==0)return "";
//公共前缀不匹配就让它变短!
s=s.substring(0,s.length()-1);
}
}
return s;
}
};
C++方法1
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() <= 0) return "";
if (strs.size() == 1) return strs[0];
if (strs[0].size() == 0) return "";
for (int index = 0; ; index++)
{
char ch=strs[0][index];
for (int i = 0; i < strs.size(); i++)
{
if (strs[i].empty()) return "";
if (ch != strs[i][index]) return strs[0].substr(0, index);
if (strs[i].size() == index) return strs[i];
}
}
}
};
C++方法2
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
string res="";
for(int i=0;i<strs[0].size();i++){
for(int j=1;j<strs.size();j++){
if(i==strs[j].length()||strs[0][i]!=strs[j][i]){
return res;
}
}
res+=strs[0][i];
}
return res;
}
};
C++方法3
(substr的第一个参数是index,第二个参数是字符串的长度,
str.substr(0, startlen)表示从0这个inde开始,取长度为startlen的子串)
class Solution {
public:
bool starts_with(const std::string& str, const std::string& start)
{
int srclen = str.size();
int startlen = start.size();
if(srclen >= startlen)
{
string temp = str.substr(0, startlen);
if(temp == start)
return true;
}
return false;
}
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)return "";
//公共前缀比所有字符串都短,随便选一个先
string s=strs[0];
for (string str : strs) {
while(!starts_with(str,s)){
if(s.length()==0)return "";
//公共前缀不匹配就让它变短
s=s.substr(0,s.length()-1);
}
}
return s;
}
};
C语言
char * longestCommonPrefix(char ** strs, int strsSize){
if(!strsSize)
return "";
char* ans = strs[0];
for(int i=1; i<strsSize; i++){//依次将字符串同ans比较
char* p = ans;
char* temp = strs[i];
while(*p != '\0' && *temp != '\0'){
if(*p != *temp){//若不相同,修改ans
*p = '\0';
break;
}
p++;
temp++;
}
if(*temp == '\0') //若当前字符串遍历完,将ans指向当前字符串
ans = strs[i];
}
return ans;
}
另外比较好的思路可以尝试去解决:
python两种让你拍大腿的解法,时间复杂度你想象不到,短小精悍(就很绝)
(1)利用python的max()和min(),在Python里字符串是可以比较的,按照ascII值排,举例abb,aba,abac,
最大为abb,最小为aba,所以只需要比较最大最小的公共前缀就是整个数组的公共前缀;
(2)利用python的zip函数,把str看成list然后把输入看成二维数组,左对齐纵向压缩,然后把每项利用集
合去重,之后遍历list中找到元素长度大于1之前的就是公共前缀.