最长公共前缀

摘要:
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入:["flower","flow","flight"]输出:"fl"示例2:输入:["dog","racecar","car"]输出:""解释:输入不存在公共前缀。方法一:水平扫描法:思路首先,我们将描述一种查找一组字符串的最长公共前缀LCP(S1…Sn]当遍历到第i个字符串的时候,找到最长公共前缀LCP(S1…否则,在执行了n次遍历之后,算法就会返回最终答案LCP(S1…商业转载请联系作者获得授权,非商业转载请注明出处。

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。

方法一:

水平扫描法:

思路
首先,我们将描述一种查找一组字符串的最长公共前缀 LCP(S1…Sn) 的简单方法。
我们将会用到这样的结论:
LCP(S1…Sn)=LCP(LCP(LCP(S1,S2),S3),…Sn)
算法
为了运用这种思想,算法要依次遍历字符串 [S1…Sn] 当遍历到第 i个字符串的时候,找到最长公共前缀 LCP(S1…Si)。当 LCP(S1…Si)是一个空串的时候,算法就结束了。

否则,在执行了 n 次遍历之后,算法就会返回最终答案 LCP(S1…Sn)。

最长公共前缀第1张

复杂度分析
时间复杂度:O(S),S 是所有字符串中字符数量的总和。
最坏的情况下,n个字符串都是相同的。算法会将 S1与其他字符串 [S2…Sn]都做一次比较。这样就会进行 S次字符比较,其中 S是输入数据中所有字符数量。
空间复杂度:O(1),我们只需要使用常数级别的额外空间。

代码实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MIN(x, y) (x<y?x:y)
char * longestCommonPrefix(char **strs, int strsSize){
int ii=0;
static char *failed_string="";
if(strsSize== 0){
return failed_string;
}
for(;ii<strsSize;ii++){
if(strlen(strs[ii]) == 0)
return failed_string;
}
char *prefix=malloc(strlen(strs[0])+1);
memset(prefix, 0, strlen(strs[0])+1);
memcpy(prefix, strs[0], strlen(strs[0])); // 将传入字符串数组中第一个元素作为prefix
int jj=1; //接着开始循环遍历,从数组下标为1的位置开始于prefix逐个字符进行比较
for(;jj<strsSize; jj++){
int kk=0;
int str_len=strlen(strs[jj]); // 获取当前需要比较的字符串的长度
int prefix_len=strlen(prefix); // 获取当前prefix字符串的长度

int cmp_len=MIN(str_len, prefix_len); // 获取二者的最小值,用于比较字符
for(;kk<cmp_len;){ //
if(!memcmp(prefix, strs[jj], kk+1)){
kk++;
}else{
break;
}
}
if(kk==0){
if(prefix){
free(prefix);
prefix=NULL;
}
return failed_string;
}else{
memset(prefix, 0, strlen(prefix));
memcpy(prefix, strs[jj], kk);
}
}
return prefix;
}

所以整体算法的时间复杂度就是字符串数组中所有字符的个数。

作者:LeetCode
链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:LeetCode
链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

免责声明:文章转载自《最长公共前缀》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Spring batch学习 详细配置解读(3)python paramiko 模块下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python编程:从入门到实践(选记)

本文参考《Python 编程:从入门到实践》一书,作者:[ 美 ] Eric Matthes 第1章 起步 1.1 搭建python环境 在不同的操作系统中, Python 存在细微的差别。 1.1.1 Python 2和Python 3 在本书中,将指出 Python 2 和 Python 3 的重大差别。1.1.2 运行Python代码片段 1.1....

MySQL快速回顾:计算字段与函数

9.1 计算字段 存储在数据库表中的数据一般不是应用程序所需要的格式。比如: 如果想要在一个字段中既显示公司名,又显示公式的地址,但这两个信息一般包含在不同的表列中。 城市、州和邮政编码存储在不同的列中,但邮件标签打印程序却需要把它们作为一个恰当格式的字段检索出来。 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。 在上面举的例子中,存储...

Python Django 前后端数据交互 之 HttpRequest、HttpResponse、render、redirect

在使用三神装的时候,首先当然是得要导入它们: from django.shortcuts import HttpResponse, render, redirect   一、HttpRequest捕获请求 捕获请求——HttpRequest对象 1、属性 HttpRequest.scheme  #一个字符串,表示请求的方案(通常是http或者https)H...

Trie树(前缀树)

Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 基本性质 1,根...

《Spark Python API 官方文档中文版》 之 pyspark.sql (四)

摘要:在Spark开发中,由于需要用Python实现,发现API与Scala的略有不同,而Python API的中文资料相对很少。每次去查英文版API的说明相对比较慢,还是中文版比较容易get到所需,所以利用闲暇之余将官方文档翻译为中文版,并亲测Demo的代码。在此记录一下,希望对那些对Spark感兴趣和从事大数据开发的人员提供有价值的中文资料,对PyS...

java函数式编程

1.函数式接口 1.1概念:java中有且只有一个抽象方法的接口。 1.2格式: 修饰符 interface接口名称 { public abstract返回值类型 方法名称(可选参数信息); //其他非抽象方法内容 } //或者 public interfaceMyFunctionalInterface { voidmyMethod(); }...