目录

1. 最长公共前缀

1.1 题目解析

1.2 解法

1.3 代码实现

2. 最长回文子串

2.1 题目解析

2.2 解法

2.3 代码实现


1. 最长公共前缀

14. 最长公共前缀 - 力扣(LeetCode)

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 如果非空,则仅由小写英文字母组成

1.1 题目解析

题目本质:
在若干字符串中寻找“所有字符串共同拥有的起始前缀”。等价于:找出最小公共“列”的连续一致部分。

常规解法:
1)把第一个串当基准,从左到右逐列比较;
2)每一列都检查“是否所有字符串在该列字符一致”;
3)一旦某列有人越界或字符不同,前缀到此为止。

问题分析:
最直观做法已是高效思路:每个字符最多被比较一次,因此总比较次数与所有字符串总长度同阶。时间复杂度可以做到 O(S)(S 为全部字符数),空间 O(1)。

思路转折:
如果直接两两比较并把“相同字符累加到全局结果”容易错,正确做法是统一按列比较(纵向扫描),或者维护前缀并逐步截短(水平扫描)。两者复杂度相同,纵向扫描实现更直观、易于避免细节错误。

1.2 解法

算法思想:
设基准串 s0 = strs[0]。对位置 i = 0..s0.length()-1:

  • 取 ch = s0[i];

  • 对每个其他字符串 sj,若 i >= sj.length() 或 sj[i] != ch,则答案为 s0.substring(0, i);

  • 若全部匹配,继续下一个位置。
    若循环结束,返回 s0 本身。

i)边界:若数组为空,返回空串。

ii)外层循环位置 i 遍历基准串每一位。

iii)内层循环字符串索引 j 从 1 到 n-1,检查第 i 位是否存在且相等。

iiii)发现不匹配立即返回前缀;全部通过则最终返回基准串。

易错点:

  • 索引混淆:  内层访问字符必须用 strs[j].charAt(i),而不是 strs[i]...。

  • substring 语义: substring(0, i) 的右端不含 i,当 i == 0 返回空串是正确结果。

  • 空字符串参与: 若某个字符串长度为 0,第一次比较即返回空串。

  • 判空与长度:  数组用 .length,字符串用 .length()。

1.3 代码实现

class Solution {public String longestCommonPrefix(String[] strs) {// 1) 边界处理if (strs == null || strs.length == 0) return "";// 2) 纵向扫描:以第一个字符串为基准,逐列检查for (int i = 0; i < strs[0].length(); i++) {char ch = strs[0].charAt(i);// 与其余字符串在第 i 位统一比较for (int j = 1; j < strs.length; j++) {// 越界或字符不等:i 之前均为公共前缀if (i >= strs[j].length() || strs[j].charAt(i) != ch) {return strs[0].substring(0, i);}}}// 3) 基准串完全通过:它本身就是最长公共前缀return strs[0];}
}

复杂度分析:

  • 时间:O(S),S 为所有字符串总长度(每个位置最多检查一次)。

  • 空间:O(1) 额外空间(只用常数级变量)。

2. 最长回文子串

5. 最长回文子串 - 力扣(LeetCode)

给你一个字符串 s,找到 s 中最长的 回文 子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

2.1 题目解析

题目本质:
在字符串中找到“关于某一中心左右对称”的最长连续子串。回文子串可由一个“中心”向两侧对称扩展得到:奇数长度中心为 (i,i),偶数长度中心为 (i,i+1)。

常规解法:
暴力枚举所有子串再判断是否回文:两重循环确定区间、再线性判断。

问题分析:
暴力法需要枚举 O(n^2) 个区间,每次校验 O(n),最坏 O(n^3),n=1000 时不够高效。

思路转折:
要想高效 → 利用“回文围绕中心对称”的性质,只需枚举中心并向两侧扩展

  • 每个中心向外扩的总步数受限于 n,因此总体最坏 O(n^2);

  • 实现简单、无额外空间;

  • 面试与刷题的主流解法(更快的 O(n) Manacher 可作为进阶)。

2.2 解法

解法

算法思想:
对每个位置 i

  • 以 (i,i) 作为奇数回文中心扩展,得到长度 len1 = r1-l1-1;

  • 以 (i,i+1) 作为偶数回文中心扩展,得到长度 len2 = r2-l2-1;

  • 取更长者更新答案起点 begin = L+1 与长度 len。
    扩展结束条件:越界或两侧字符不等。

i)特判:空串或长度 1 直接返回。

ii)初始化 begin=0,len=0。

iii)遍历中心 i = 0..n-1:

  • 令 l=i,r=i,while 两侧相等则扩展;根据 right-left-1 更新答案;

  • 令 l=i,r=i+1,同理扩展并比较更新。

iiii)返回 s.substring(begin, begin+len)(右端开区间)。

易错点:

  • 区间边界:扩展结束时下标已越过合法区间,真正回文是 (left+1, right-1),长度为 right-left-1;最终 substring 用 [begin, begin+len)。

  • 奇/偶中心都要尝试:只试一种会漏解。

  • 变量遮蔽:没必要定义类字段 left/right,用方法内局部变量即可,避免混淆。

2.3 代码实现

class Solution {public String longestPalindrome(String s) {int n = s.length();if (n < 2) return s; // 长度为 0/1,自己就是最长回文int begin = 0, len = 1; // 至少有 1 个字符时,单字符是回文for (int i = 0; i < n; i++) {// 奇数中心 (i, i)int l = i, r = i;while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) { l--; r++; }if (r - l - 1 > len) {begin = l + 1;len = r - l - 1;}// 偶数中心 (i, i+1)l = i; r = i + 1;while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) { l--; r++; }if (r - l - 1 > len) {begin = l + 1;len = r - l - 1;}}return s.substring(begin, begin + len);}
}

复杂度分析

  • 时间:最坏 O(n^2)(每个中心向外扩总步数受限于 n)。

  • 空间:O(1) 额外空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98193.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98193.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98193.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python毕业设计推荐:基于Django的饮食计划推荐与交流分享平台 饮食健康系统 健康食谱计划系统

精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二…

物联网双轴倾角传感器厂家全面解析

内容概要本文旨在全面解析物联网双轴倾角传感器厂家的核心竞争力&#xff0c;为进口设备代理商及工业物联网项目提供实用选型指南。我们将深入探讨行业领先制造商的研发实力和生产标准&#xff0c;重点分析产品特性如低功耗设计优势、0.2高精度测量特性&#xff0c;以及CAN/电流…

Docker学习笔记-网络类型

Docker 网络类型1、Docker四种网络模式 &#xff08;1&#xff09;docker四种网络模式如下&#xff1a; Bridge contauner 桥接式网络模式Host(open) container 开放式网络模式Container(join) container 联合挂载式网络模式&#xff0c;是host网络模式的延伸None(Close)…

SDRAM详细分析-08 数据手册解读

大家好,这里是大话硬件。 前面我们梳理了很多关于内存的内容,不知道有没有人好奇,为什么要花这么大的精力做这些内容? 在4月份的时候,三星宣布将在2025年逐步停产DDR4内存颗粒,随后海力士和镁光也跟着一起,都宣布逐步停产DDR4颗粒。这三家半导体厂商在内存方面顶了半边…

Windows 环境下部署 MinIO 集群

文章目录介绍软件特点下载多机分布式集群部署1.前提准备2. 新建minio工作目录3. 编写运行命令4. 启动、测试5. nginx配置介绍 MinIO 是一款高性能、开源、云原生的分布式对象存储系统&#xff0c;专为私有云、公有云和边缘计算场景设计&#xff0c;完全兼容 Amazon S3 API&…

鸿蒙libxm2交叉编译

一开始先使用了lycium,但是没有编译通过 改为使用源码自带的配置文件编译 我使用的源码是libxml2-2.9.10.tar.gz 解压后进行下面的配置: root@ubuntu:/home/lw/libxml2-2.9.10# export OHOS_SDK=/home/lw/ohos-sdk/linuxroot@ubuntu:/home/lw/libxml2-2.9.10# export AS=…

MCAP :机器人数据容器的全面实践指南

Outline: MCAP 已形成完整工具链生态&#xff1a; Foxglove Studio&#xff1a;可视化分析工具mcap-cli&#xff1a;跨平台命令行工具AWS RoboMaker&#xff1a;原生云存储支持 随着 IEEE 正在制定的 P3196 机器人数据标准&#xff0c;MCAP 正在演进为行业基础架构的重要组成…

【Bluedroid】A2dp Source播放流程源码分析(7):蓝牙音频流启动流程深度解析(btif_av_stream_start)

本文深入分析Android Bluetooth协议栈中A2DP音频流启动的完整流程,从应用层调用btif_av_stream_start()开始,穿越BTIF、BTA、AVDTP多层架构,最终通过L2CAP发送AVDTP启动命令。揭示状态机驱动、异步消息传递、流控制等核心机制。并通过代码与日志结合的方式,揭示蓝牙音频流从…

Miniconda安装与VSCode搭建远程Python、Jupyter开发环境

前言 数据科学和机器学习工作流程中&#xff0c;当本地计算机无法满足计算任务的需求时&#xff0c;往往需要一个更强大计算能力的远程环境。另一方面&#xff0c;VSCode由于其轻便和易用性&#xff0c;以及丰富的插件生态系统&#xff0c;一直是远程开发的首选编辑器。本文介绍…

vue3前端开发的基础教程——快速上手

【前言】这里使用的技术栈&#xff1a;fastapivue3pycharm一、创建vue3项目在项目的文件夹使用下面命令创建vue3前端框架代码npm create vitelatest frontend选择框中选择&#xff1a; Framework: VueVariant: JavaScript 或 TypeScript cd frontend npm install启动本地开发np…

51单片机2(按键,外部中断,定时器中断,PWM与蜂鸣器)

1.按键模块以按键k1为例&#xff1a;两个引脚被接到GND和P1_4引脚&#xff0c;当K1按键被按下时&#xff0c;P1_4引脚会和GND短路到一起&#xff0c;P1_4引脚会呈现低电平。按键初始化&#xff1a;//按键初始化 void Key_Init(void) {P1 | (0x0f << 4);P3 | (1 << …

【面试向】人工智能机器学习介绍

一、介绍 人工智能&#xff08;AI&#xff09;是通过模拟、延伸和扩展人类智能的技术&#xff0c;使机器能够感知、理解、决策和行动。核心目标是实现“智能自动化”&#xff0c;即让机器在复杂、动态的环境中自主完成任务&#xff0c;甚至超越人类在特定领域的能力。 机器学…

Python趣味入门:打印与计算初体验

1. 尝试使用 print() 打印各种内容print() 是我们在Python中最先接触也是最常用的函数之一。它的核心功能是将内容输出到控制台。让我们用它来玩点花样&#xff1a;在您的IDE中创建一个新的Python文件&#xff08;例如 play_with_print.py&#xff09;&#xff0c;然后尝试以下…

swagger接口文档规范化(苍穹外卖)

swagger接口文档规范化 &#xff08;1&#xff09;说明&#xff1a; 将接口文档分为管理端和用户端 &#xff08;2&#xff09;WebMvcConfiguration修改 位置&#xff1a;sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java 文件完整代码&#xff1a; pa…

Transformer 架构的演进与未来方向(RNN → Self-Attention → Mamba)——李宏毅大模型2025第四讲笔记

一句话总结——“所有架构都为了解决上一代模型的致命缺陷而生&#xff1a;CNN 解决参数爆炸&#xff0c;ResNet 解决梯度消失&#xff0c;Transformer 解决 RNN 无法并行&#xff0c;而 Mamba 则试图一次解决 Transformer 的 O(N) 与 RNN 的记忆瓶颈。”1 每种架构的存在理由•…

Vllm-0.10.1:通过vllm bench serve测试TTFT、TPOT、ITL、E2EL四个指标

一、KVM 虚拟机环境GPU:4张英伟达A6000(48G)内存&#xff1a;128G海光Cpu:128核大模型&#xff1a;DeepSeek-R1-Distill-Qwen-32B推理框架Vllm:0.10.1二、四个性能指标介绍2.1、TTFT:Time to First token首次生成token时间&#xff08;ms&#xff09;,TTFT 越短&#xff0c;用户…

逻辑回归基础

昨天一直在复盘梯度下降&#xff0c;都没咋预习逻辑回归&#xff0c;好在不是很难&#xff0c;来捋捋逻辑回归简介逻辑回归是解决分类问题数学基础-sigmoid函数还要回顾一下概率论极大似然估计再来看一下对数逻辑回归原理逻辑回归的损失函数例子&#xff1a;分类问题评估混淆矩…

STM32----W25QXX

W25QXX款图W25QXX存储解读块--->扇-->页块分成128块一块64kb一块分成16扇一扇4kb一个扇区分成16页&#xff0c;页的大小是256个字节 当数据传入W25QXX最小的擦除单元是扇区当已经输入了一页的数据&#xff0c;这时RAM的数据会转存进FLASH&#xff0c;这时会置一个标志位&…

【Kafka】Kafka使用场景用例Kafka用例图

【Kafka】Kafka使用场景用例&Kafka用例图一、Kafka用例总图二、Kafka用例图示三、Kafka场景案例图一、Kafka用例总图 二、Kafka用例图示 三、Kafka场景案例图 注&#xff1a;以上图片来源于网络&#xff0c;如有不妥请私信删除&#xff01;

Altium Designer(AD24)集成开发环境简介

🏡《专栏目录》 目录 1,概述 2,界面介绍 2,搜索功能简介 1,概述 Altium Designer 24的原理图,PCB等设计工作都是在集成开发环境中进行的,本文简单介绍集成开发环境界面。 2,界面介绍 如下图所示,Altium Designer 24的集成开发环境,包括: 标题栏:目前设计中文件的…