14. 最长公共前缀

题目:14. 最长公共前缀

简单
相关标签
相关企业
编写一个函数来查找字符串数组中的最长公共前缀。

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

示例 1:

输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:

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

思路:纵向扫描

纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。

语法知识:

  1. substr
    substr是C++中的一个字符串函数,用于获取字符串的子串。它的第一个参数是子串的起始位置,第二个参数是子串的长度。在这里,我们将起始位置设为0,长度设为当前位置i,即获取从字符串开头到当前位置的子串。
    例如,如果最长公共前缀是"fl",而当前位置i=2,则strs[0].substr(0, i)将返回"fl"

  2. strs[0].size()和strs.size()的区别:
    strs[0].size()是第一个字符串的长度
    strs.size()是所有字符串的个数

代码:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
          if(!strs.size())
          return "";
          int len = strs[0].size();
          int length = strs.size();
          for(int i=0;i<len;i++)
          {
              char a = strs[0][i];
              for(int j=1;j<length;j++)
              {
                  if(strs[j][i]!=a||i==strs[j].size())
                  return strs[0].substr(0,i);
              }
          }
          return strs[0];
    }
};

运行的过程:

当输入的字符串数组strs["flower", "flow", "flight"]时,我们来逐步执行这段代码的过程。

首先,判断strs是否为空,由于strs不为空,我们继续执行。

然后,获取第一个字符串的长度,即length = strs[0].size(),此时length的值为6

接着,获取字符串数组的长度,即count = strs.size(),此时count的值为3

接下来,我们开始外层循环,从第一个字符开始逐个比较每个字符串的字符。

  • 第一次循环,i = 0,取出第一个字符串的第一个字符c = 'f'。然后,我们进入内层循环,遍历剩余的字符串。

    • 对于第二个字符串"flow",在当前位置i = 0,字符'f'与第一个字符串的字符相等,继续下一个字符串。

    • 对于第三个字符串"flight",在当前位置i = 0,字符'f'与第一个字符串的字符相等,继续下一个字符串。

  • 第二次循环,i = 1,取出第一个字符串的第二个字符c = 'l'。然后,我们进入内层循环,遍历剩余的字符串。

    • 对于第二个字符串"flow",在当前位置i = 1,字符'l'与第一个字符串的字符相等,继续下一个字符串。

    • 对于第三个字符串"flight",在当前位置i = 1,字符'l'与第一个字符串的字符相等,继续下一个字符串。

  • 第三次循环,i = 2,取出第一个字符串的第三个字符c = 'o'。然后,我们进入内层循环,遍历剩余的字符串。

    • 对于第二个字符串"flow",在当前位置i = 2,字符'o'与第一个字符串的字符相等,继续下一个字符串。

    • 对于第三个字符串"flight",在当前位置i = 2,字符'o'与第一个字符串的字符不相等,返回。

    • 对于第三个字符串"flight",在当前位置i = 2,字符'i'与第一个字符串的字符不相等,此时最长公共前缀已经结束,返回第一个字符串的子串,从开头到当前位置,即"fl"

因此,最终的最长公共前缀为"fl"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值