PY
1、代码核心思路:
- 找到字符串数组中的最小和最大字符串。
- 逐个比较最小和最大字符串的字符,直到找到不同的字符。
- 返回最大字符串中不同字符之前的部分作为结果。
2、代码核心思路:
- 使用 zip 函数将字符串数组中相同位置的字符打包成元组。
- 逐列比较字符元组,如果发现某一列有不同的字符,就返回第一个字符串在该列之前的部分。
- 如果没有发现不同的字符,返回字符串数组中最短的字符串。
import os
class Solution:
def longestCommonPrefix(self, strs):
# 时间:len(s2)*n,空间:1
if not strs: return ""
s1 = min(strs)
s2 = max(strs)
for i, str in enumerate(s1):
if str != s2[i]:
return s2[:i]
return s1
# 时间:len(average(strs))*n, 空间:1
if not strs: return ""
# 使用 zip 将字符串数组中相同位置的字符打包成元组
for i, str in enumerate(zip(*strs)):
# 如果集合中的元素数大于1,说明当前位置的字符不相同
if len(set(str)) > 1:
return strs[0][:i]
# 如果没有找到不相同的字符,返回最短的字符串
return min(strs)
# os.path.commonprefix 标准库
return os.path.commonprefix(strs)
C++
算法思路跟上面是相同的,这里就不讲解了。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
string s1 = *min_element(strs.begin(), strs.end());
string s2 = *max_element(strs.begin(), strs.end());
for (int i = 0; i < s1.length(); ++i)
{
if (s1[i] != s2[i]) return s1.substr(0, i);
}
return s1;
if (strs.empty()) return "";
sort(strs.begin(), strs.end());
string s1 = strs.front();
string s2 = strs.back();
int i;
for ( i = 0; i < s1.size() && s1[i] == s2[i]; ++i);
return s1.substr(0, i);
}
};