这种简单题答案还是挺多的,可以看下官方给的一些解答参考,也算增长下知识,开拓下思路,除了那个什么树,其他都挺常规的感觉。
C++代码:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0) return "";
if(strs.size()==1) return strs[0];
int idx = 0;
bool flag = true;
while(idx<strs[0].length()){
for(string str : strs){
if(str[idx] != strs[0][idx]){
flag = false;
break;
}
}
if(flag==true){
idx++;
}else{
break;
}
}
if(idx == 0){
return "";
}else{
return strs[0].substr(0, idx);
}
}
};
Python3代码:分治思想
Example: strs = ["adsfd","adhghh", "adhfdf", "adfkdsjg", "adfkfj", "adfhg"]
class Solution:
def __commonPrefix__(self, left: str, right: str) -> str:
'''
求两个字符串的最大公共子串
'''
i = 0
while(i<min(len(left), len(right))):
if(left[i] != right[i]):
return left[:i]
else:
i += 1
return left if len(left)<len(right) else right
def __longestCommonPrefix__(self, strs: List[str], l: int, r: int) -> str:
'''
分治法核心,类似于归并排序
将多个字符串,按照2分等分原则,依次分成左右两份
分别计算每个小份左右的最长公共字串,依次左右合并
最后计算整个左右合并的字符串的公共子串
'''
if l==r:
return strs[l]
else:
mid = (l + r) // 2
lcpLeft = self.__longestCommonPrefix__(strs, l, mid)#求左边最长公共子串
lcpRight = self.__longestCommonPrefix__(strs, mid+1, r)#求右边最长公共子串
return self.__commonPrefix__(lcpLeft, lcpRight)#求整个最长公共子串
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs)==0:
return ""
return self.__longestCommonPrefix__(strs, 0, len(strs) - 1)