字符串数组的最长公共前缀

描述

给你一个长度为 nn 的字符串数组 strsstrs , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。

数据范围:

0 \le n \le 10000≤n≤1000

0 \le len(strs[i]) \le 50000≤len(strs[i])≤5000

示例1

输入:

["abca","abc","abca","abc","abcc"]

复制返回值:

"abc"

复制

解法一:纵向扫描

  • 将字符串数组看作一个二维空间,每一次从第一列开始。
  • 确定所有字符子串中第一列字符。
  • 逐层扫描后面每一列,遇到不同字符停止扫描。
  • 图解:
  • 图片说明

Java参考代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

import java.util.*;

public class Solution {

    /**

     *

     * @param strs string字符串一维数组

     * @return string字符串

     */

    public String longestCommonPrefix (String[] strs) {

        // //纵向扫描

        if(strs.length==0 || strs==null){

            return "";

        }

        int rows = strs.length;

        int cols = strs[0].length();

        //开始扫描

        for(int i=0;i<cols;i++){

            char firstChar = strs[0].charAt(i);

            for(int j=1;j<rows;j++){

                if(strs[j].length()==i || strs[j].charAt(i)!=firstChar){

                    return strs[0].substring(0,i);

                }

            }

        }

        return strs[0];

    }

}

复杂度分析:

时间复杂度:O(M*N) 其中 M 是字符串数组中的字符串的平均长度,N是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次

空间复杂度:O(1) 常数空间的复杂度

解法二:横向扫描

  • 首先确定第i个与第i+1个字符串子串相同的公共前缀K。
  • 将上面找到的前缀K与第i+2个子串进行对比,得到他们的公共前缀K1
  • 重复上述步骤,最终得到字符串的最长公共前缀
  • 图解
  • 图片说明

Java参考代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

import java.util.*;

public class Solution {

    /**

     *

     * @param strs string字符串一维数组

     * @return string字符串

     */

    public String longestCommonPrefix (String[] strs) {

        // 横向扫描

        if(strs.length==0 || strs==null){

            return "";

        }

        //以第一个字符开始

        String prefix = strs[0];

        for(int i=1;i<strs.length;i++){

            prefix = GetCommonPrefix(prefix,strs[i]);

            //表示最长公共前缀就是""

            if(prefix.length()==0){

                return "";

            }

        }

        return prefix;

    }

    //返回两子串公共前缀函数

    public String GetCommonPrefix(String s1,String s2){

        int len= Math.min(s1.length(),s2.length());

        int flag=0;

        while(flag<len && s1.charAt(flag)==s2.charAt(flag)){

            flag++;

        }

        return s1.substring(0,flag);

    }

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于给定的字符串数组,我们需要找到这些字符串中的最长公共前缀。可以使用以下方法来解决这个问题: 1. 首先,定义一个变量prefix,用于保存最长公共前缀。 2. 初始化prefix为第一个字符串strs。 3. 遍历字符串数组中的每个字符串,从第二个字符串开始。 4. 对于每个字符串str,从第一个字符开始逐个比较它和prefix对应位置的字符是否相等,直到遇到不相等的字符或者到达其中一个字符串的末尾。 5. 如果遇到不相等的字符或者到达其中一个字符串的末尾,将prefix截取到当前位置,并更新prefix为截取后的结果。 6. 继续遍历下一个字符串,重复步骤4和步骤5,直到遍历完所有的字符串。 7. 返回最终得到的prefix作为最长公共前缀。 根据引用的代码,我们可以看到这段代码实现了以上的方法。时间复杂度为O(M*N),其中M是字符串数组中字符串的平均长度,N是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [字符串数组最长公共前缀](https://blog.csdn.net/u010365819/article/details/120164964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值