14. 最长公共前缀

46 阅读2分钟

14. 最长公共前缀

简单

相关标签

premium lock icon相关企业

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

 

示例 1:

输入: strs = ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: strs = ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

 

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 如果非空,则仅由小写英文字母组成

题解:

输入用什么方式读入?扫描该如何扫描? 先回答第二个问题,由于一刷的经验,此时扫描是固定y,x纵向扫描下去,所以外层循环是j,内层循环用i。 输入一开始采用gets读取size次,但是会读取到回车符号。 后来采用scanf("%s, )解决了问题。

复习以下gets相关知识,gets是读入缓冲区的字符,包括空格,直到遇到回车时停止,并且把换行读取但是换成'\0'存储。这里面把scanf改成gets会出现问题,是因为一开头的scanf("%d", )会残留一个回车在缓冲区,此时如果直接gets,会把这个回车读进来形成空字符。若在scanf("%d", )后面加一个空的getchar();(读取单个字符函数),即可解决这个问题。但是我最后选择使用scanf直接解决问题。此分析仅为研究学习gets和字符读入用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char str[200][200] = {'\0'};
    char ans[200] = {'\0'};

    int size, i, j, flag = 0;
    scanf("%d", &size);
    // getchar();
    for (i = 0;i <= size - 1;i ++)
    {
        scanf("%s", &str[i]);
        // gets(str[i]);
    }
    j = 0;
    while (j < 200)
    {
        for (i = 0;i <= size - 1;i ++)
        {
            if (str[i][j] != '\0' && str[i][j] == str[0][j])
            {
                flag = 1;
            }
            else
            {
                flag = 0;
                break;
            }
        }
        if (flag == 0)
        {
            break;
        }
        else
        {
            flag = 0;
            ans[j] = str[0][j];
        }
        j ++;
    }

    printf("%s", ans);

    return 0;
}