# 最长公共前缀
# 这次没有流程图
# 图片源自 leetcode
# 1.1 题目
# 1.2 思路:
老实说,这道题目一开始我只想到了暴力的解题方法,纵向扫描法,简单来说就是一列一列的扫描字母,只要有不同就直接在当前位置放入
'\0'
返回strs[0]
. 很显然这是一个 O (m*n) 级复杂度的算法
一般来说这种复杂度可以 优化 为 nlogn 很容易就会想到第二种解法 —— 分治,简单来说,就是 将 strsSize 分到最小化,即两两比较后返回最大子序列,将子序列,再进行 比较 得出子序列的最长子序列,最终得出的字符串即为返回值
# 1.3 图解思路
# 由于个人画图能力有限,列下图片来源于 LeetCode 官方
# 2.1 纵向扫描
# 2.2 分治
# 1.4 代码
# 1.4.1 纵向扫描
char *longestCommonPrefix(char **strs, int strsSize) {// 纵向扫描 if (0 == strsSize) return ""; for (int i = 0; strs[0][i]; i++){
for (int j = 1; j < strsSize; j++){
if (strs[0][i] != strs[j][i]){
strs[0][i] = '\0'; return strs[0];}
}
}
return strs[0];}
# 1.4.2 分治
char *getPrefix(char *lStr, char *rStr){
for (int i = 0; '\0' != lStr[i]; i++){
if (lStr[i] != rStr[i]){
lStr[i] = '\0'; return lStr;}
}
return lStr;}
char *getLongestCommonPrefix(char **strs, int start, int end){
if (end == start) return strs[start];// 二分防溢出
int mid = (end - start) / 2 + start;// 递归分治
char *lcpL = getLongestCommonPrefix(strs, start, mid); char *lcpR = getLongestCommonPrefix(strs, mid + 1, end);// 获取最终子序列
return getPrefix(lcpL, lcpR);}
char *longestCommonPrefix(char **strs, int strsSize){
if (0 == strsSize) return ""; return getLongestCommonPrefix(strs, 0, strsSize - 1);}