最长公共前缀问题————leetcode第14题详解

请看下题,题目来源自leetcode第14题:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”

示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”

解释: 输入不存在公共前缀。
说明:

所有输入只包含小写字母 a-z 。

第一眼看到就是暴力做法,把第一个字符串当作基准,分别跟第二个,第三个,第四个…字符串去对比,拿一个count来计数,取最大的count即可,剩下的就是根据count个数从第一个字符串中取字符即可,说实话这种方法是我们最容易想到的,当然也是最基础的最简单的,但是鸡汁的我肯定不能用这么平民的方法啊,这不就没什么意思了么,所以,这里要讲到的是垂直扫描。
垂直扫描,这个词语听起来好像很高大上的亚子,其实,就是这么个东西:

f l o w e r
f l o w
f l i g h t

对于上面三个字符串,我们如何使用垂直搜索呢?
(1)先比较第一列,有相同的字母f,get it!
(2)再比较第二列,有相同字母l,get it!
(3)再比较第三列,第三个字符串不一样,所以到这里就结束了。
所以其实垂直搜索就是一列一列比较,直到某一个字符串不一样或者某一个字符串到头了。
代码实现如下:

char * longestCommonPrefix(char ** strs, int strsSize){
if(strsSize==0)
{
    return "";
}
//注意这里注释掉的这一行
//int strscount = strlen(strs[0]);
for(int i=0;i<strlen(strs[0]);i++)
{
    for(int j=1;j<strsSize;j++)
    {
        if(strs[0][i]!=strs[j][i])
        {
        //末尾插入'\0'表示字符串结束
          strs[0][i]='\0';
           break;
        }
    }
}
return strs[0];
}

这段代码要注意的是注释掉的一行,不能自己声明一个int型变量来在第一个for循环中使用,因为你并不确定字符串中有多少个字符,所以你没法确定是不是int,这里一定要注意,否则会报一个溢出错误。
That’s All.

原创文章 24 获赞 2 访问量 912

猜你喜欢

转载自blog.csdn.net/weixin_43653187/article/details/105827718