力扣由浅至深 每日一题.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 "";
    }
}
相关推荐
黎阳之光3 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生
随意起个昵称3 小时前
【BFS】冰面滑行
算法·宽度优先
ForteScarlet3 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖3 小时前
Java深入解析篇六十二之安全机制详解
java·开发语言
小刘在重生~3 小时前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
Orange_sparkle3 小时前
Pi Agent vs LangGraph:从人机交互、企业 RAG 到持久化工作流的完整选型指南
java·网络·人机交互
(Charon)4 小时前
【C++】定时器进阶:使用最小堆管理定时任务
c++·算法
hansang_IR4 小时前
【题解】 [省选联考 2021 A/B 卷] 卡牌游戏
c++·算法
这个DBA有点耶5 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康5 小时前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题