力扣由浅至深 每日一题.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 "";
    }
}
相关推荐
大傻^20 小时前
LangChain4j Spring Boot Starter:自动配置与声明式 Bean 管理
java·人工智能·spring boot·spring·langchain4j
沐硕20 小时前
《基于改进协同过滤与多目标优化的健康饮食推荐系统设计与实现》
java·python·算法·fastapi·多目标优化·饮食推荐·改进协同过滤
Z9fish20 小时前
sse哈工大C语言编程练习47
c语言·数据结构·算法
nglff20 小时前
蓝桥杯抱佛脚第一天|简单模拟,set,map的使用
算法·职场和发展·蓝桥杯
愣头不青20 小时前
560.和为k的子数组
java·数据结构
仟濹20 小时前
【算法打卡day27(2026-03-19 周四)】蓝桥云课中Lv.1难度中的绝大部分题
算法·蓝桥杯
共享家952720 小时前
Java入门(String类)
java·开发语言
罗湖老棍子20 小时前
滑动窗口与双调队列:幕布覆盖问题(定右缩左满分板子)改编自LeetCode 1438
算法·滑动窗口·单调队列
l软件定制开发工作室20 小时前
Spring开发系列教程(34)——打包Spring Boot应用
java·spring boot·后端·spring·springboot
CoovallyAIHub20 小时前
ICLR 2026 | MedAgent-Pro:用 Agent 工作流模拟临床医生的循证诊断过程
深度学习·算法·计算机视觉