力扣由浅至深 每日一题.04 最长公共前缀

希望我们都能对抗生活的苦难,在乌云周围突破阴霾积极的生活

------ 24.3.12

14. 最长公共前缀

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

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

示例 1:

复制代码
输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

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

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

解法一

将字符串数组传入,先进行一个判空操作,将字符串数组的长度传为len,根据长度len进行for循环,递归

Math.min(str1,str2),两字符串较短字符串的长度

subString 常用方法一:

String a ="123456anbdc"; String b = a.subString(1);

此时得到的为字符串a从下标为1的位置开始截取到最后的值,也就是23456anbdc;

subString常用方法二:

String a ="123456anbdc"; String b = a.subString(1,5);

此时得到的为字符串a从下标为1的位置开始截取到下标为5的位置的值(不包括下标为5的值),也就是2345;

subString常用方法三:

String a ="123456anbdc";

String b = a.subString(1,a.index0f("b"));

此时得到的为字符串a从下标为1的位置开始截取到指定字符串"b"的值,也就是23456an;(注:如指定字符串有多个,以第一个为(说明:a.index0f("b")就是取字符串"b"的下标,和上面的用法本质是一样的)

java 复制代码
class Solution {
    public String longestCommonPrefix(String[] strs) {
        String strss = strs[0];
        int len = strs.length;
        if(strs == null || strs.length == 0){
            return "";
        }
        for(int i = 0;i < len;i++){
                //方法的重载,传入参数个数不同
            strss = longestCommonPrefix(strss,strs[i]);
            if(strss.length() == 0){
                break;
            }
        }
        return strss;
    }

    public String longestCommonPrefix(String str1,String str2){
        int len = Math.min(str1.length(),str2.length());//两字符串较短字符串的长度
        int index = 0;
        while(index < len && str1.charAt(index) == str2.charAt(index)){
            index++;
        }
        return str1.substring(0,index);
    }
}

解法二

两层for循环进行遍历

纵向扫描

时间复杂度:O(mn) m 表示字符串数组中所有字符串的平均长度,n 表示字符串数组的大小

空间复杂度:O(1)

charAt函数:用于返回指定索引处的字符,索引范围为从0到lenth()-1

用法:字符串.charAt()

java 复制代码
class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        int length = strs[0].length();
        int count = strs.length;
        for (int i = 0; i < length; i++) {
            char c = strs[0].charAt(i);
            for (int j = 1; j < count; j++) {
                if (i == strs[j].length() || strs[j].charAt(i) != c) {
                    return strs[0].substring(0, i);
                }
            }
        }
        return strs[0];
    }
}
java 复制代码
class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs==null) return "";
        int prefixIndex=strs[0].length();
        String prefix=strs[0];
        int i=0;
        while(prefixIndex>0){
            if(strs[i].startsWith(prefix.substring(0,prefixIndex))) i++;
            else prefixIndex--;
            if(i>=strs.length) return prefix.substring(0,prefixIndex);
        }
        return "";
    }
}
相关推荐
eternal__day2 分钟前
Spring Cloud 多机部署与负载均衡实战详解
java·spring boot·后端·spring cloud·负载均衡
颜淡慕潇7 分钟前
Redis 实现分布式锁:深入剖析与最佳实践(含Java实现)
java·redis·分布式
程序员秘密基地13 分钟前
基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql数据库,在线考试系统
java·vue.js·spring boot·spring·web app
何中应14 分钟前
【设计模式-5】设计模式的总结
java·后端·设计模式
草莓熊Lotso15 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM21 分钟前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
吾日三省吾码32 分钟前
Spring 团队详解:AOT 缓存实践、JSpecify 空指针安全与支持策略升级
java·spring·缓存
CV点灯大师35 分钟前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
风象南1 小时前
SpringBoot的5种日志输出规范策略
java·spring boot·后端
GGBondlctrl1 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想