LeetCode-14 最长公共前缀

  • 题目:14. 最长公共前缀
  • 难度:简单
  • 分类:字符串
  • 解决方案:字符串遍历

今天我们学习第14题最长公共前缀,这是一道简单题。像这样字符串的题目经常作为面试题来考察面试者算法能力和写代码能力,因此最好能手写出该题。下面我们看看这道题的题目描述。

题目描述

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

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

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

示例 2:

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

分析

这个题目让我们求字符串数组中的最长公共前缀,我们可以使用第0行的字符串作为基准,与其他剩余的字符串比较来找出最长的公共前缀,示例1分析方法如下图所示:

在这里插入图片描述

将上述分析方法转化为java代码如下所示:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        StringBuilder res = new StringBuilder();
        
        if(strs == null || strs.length == 0 )
            return  res.toString();
        
        for (int col = 0; col < strs[0].length(); col++){
            // 第0行的第col个字符
            char c = strs[0].charAt(col); 
            
            // 基准字符串中的字符与其他字符串中的字符进行对比
            for(int row = 1; row < strs.length; row++){
                if(col >= strs[row].length() || strs[row].charAt(col) != c)
                    return  res.toString();
            }
            
            res.append(c);
        }
        
        return res.toString();
    }
}

在这里插入图片描述

仔细想想,如果字符串数组按照字符顺序排好序后(可以使用相关语言的排序函数进行排序,排好序后数组中共同字母多的字符串会被放到一起,而共同字符最少的字符串则会被放到首尾两端),我们不需要比较所有的字符串,而只需要比较首字符串和尾字符串即可,用这种排序方法对示例1分析的示意图如所下图所示:
在这里插入图片描述

将上述分析方法转化为java代码如下所示:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        StringBuilder res = new StringBuilder();
        
        if(strs == null || strs.length == 0 )
            return  res.toString();
        
        // 将字符串数组排序
        Arrays.sort(strs);
    
        // 取数组中的首尾字符串,并将其转为字符数组
        char[] firstRow = strs[0].toCharArray();
        char[] lastRow = strs[strs.length-1].toCharArray();
        
        // 查找公共前缀时只需要查找最短长度的字符串
        int len = firstRow.length < lastRow.length ? firstRow.length : lastRow.length;
        
        // 比较首位两个字符串,取最长公共前缀
        for(int i=0; i<len; i++){
            if(firstRow[i] != lastRow[i])
                return res.toString();
            res.append(firstRow[i]);
        }
        return res.toString();
    }
}

在这里插入图片描述

Github地址

LeetCode-14 最长公共前缀

参考链接

14.最长公共前缀

在这里插入图片描述

更多文章请添加公众号:算法半岛(扫描上图二维码即可关注)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值