当前位置: 首页 > news >正文

千问 LeetCode 2781. 最长合法子字符串的长度 Java实现

这道题是 LeetCode 第 2781 题“最长合法子字符串的长度”,属于一道经典的双指针(滑动窗口)问题。

题目解析
给定一个字符串 word 和一个禁用字符串数组 forbidden,要求找出 word 中最长的子字符串,且该子字符串不包含 forbidden 中的任何一个字符串。

核心思路:双指针(滑动窗口) + 逆向枚举
1. 双指针维护合法区间:使用 left 和 right 两个指针维护一个合法的滑动窗口,right 不断向右扩展,left 在遇到非法情况时向右收缩。
2. 利用题目约束进行优化:题目中有一个非常关键的提示——forbidden[i] 的长度不超过 10。这意味着,当我们把 right 指针向右移动一位时,新产生的非法子串(如果存在)一定是以当前 right 为结尾,且长度在 1 到 10 之间的某个子串。
3. 逆向检查与更新左边界:每当 right 移动后,我们只需要从 right 开始,倒着往前最多枚举 10 个字符(即检查 word.substring(i, right + 1) 是否在禁用列表中)。如果发现某个子串在 forbidden 中,说明当前的 left 必须收缩到这个非法子串的右边(即 left = i + 1),从而保证窗口 [left, right] 始终是合法的。

Java 代码实现

import java.util.HashSet;
import java.util.List;
import java.util.Set;

class Solution {
public int longestValidSubstring(String word, List<String> forbidden) {
// 将 forbidden 数组存入 HashSet,实现 O(1) 时间复杂度的查找
Set<String> set = new HashSet<>(forbidden);

int n = word.length();
int ans = 0;
int left = 0;

// right 指针不断向右扩展
for (int right = 0; right < n; right++) {
// 从当前 right 位置开始,倒着往前最多检查 10 个字符
// 因为 forbidden 中最长的字符串长度只有 10
for (int i = right; i >= left && i > right - 10; i--) {
// 截取子串 word[i...right]
String sub = word.substring(i, right + 1);
if (set.contains(sub)) {
// 如果发现了非法子串,左指针必须收缩到该非法子串的右侧
left = i + 1;
// 找到一个非法的就可以停止了,因为我们要找的是最靠左的冲突点来更新 left
break;
}
}
// 更新最长合法子字符串的长度
ans = Math.max(ans, right - left + 1);
}

return ans;
}
}

复杂度分析
* 时间复杂度:O(N)。虽然代码中有一个嵌套的 for 循环,但由于 forbidden 字符串的最大长度限制为 10,内层循环最多只会执行 10 次(常数级别)。因此,整体时间复杂度取决于外层 right 指针的遍历,即 O(N),其中 N 是 word 的长度。
* 空间复杂度:O(M)。我们需要一个哈希集合来存储 forbidden 数组中的字符串,其中 M 是 forbidden 数组中所有字符串的总长度。

这种方法巧妙地利用了数据范围的限制,将原本可能需要复杂字符串匹配(如 AC自动机/Trie图)的问题,简化为了非常直观且高效的双指针滑动窗口问题。

http://www.jsqmd.com/news/901113/

相关文章:

  • 解密paraphrase-albert-small-v2模型架构:AlbertModel与均值池化的完美结合
  • Spring Cloud Alibaba基础教程:与Dubbo的完美融合
  • 2026年质量好的轴承磨床/特微型伺服磨床/无锡无心磨床可靠供应商推荐 - 行业平台推荐
  • 8051非标准芯片开发:SFR支持与C51工具链实践
  • 2026年口碑好的石家庄钢结构车间/石家庄厂区钢结构/石家庄钢结构工程/石家庄钢结构库房品牌厂家推荐 - 行业平台推荐
  • 别再死记硬背RC时间常数了!用Multisim仿真,5分钟搞懂电容充放电全过程
  • ROS机器人数据回放新姿势:用ffmpeg把rosbag里的图像流变成高清MP4视频
  • 小爱音箱开源固件改造终极指南:解锁智能设备完整控制权
  • Unity运行时也能导出模型?手把手教你用C#脚本实现游戏内OBJ导出功能
  • winform4
  • 2026年 宝钢HC1150/1400MS吉帕钢推荐榜:汽车轻量化超高强度冷轧钢板/先进高强钢/热成形用钢/吉帕级材料源头厂家解析 - 品牌企业推荐师(官方)
  • TCP/IP--七层通信
  • 别再手动轮询了!用Nginx给本地Nacos集群做个‘管家’(RuoYi-Cloud-Plus实战)
  • CSAPP CacheLab避坑指南:从Ubuntu换源到C语言文件操作,手把手解决实验环境搭建难题
  • 如何高效管理多任务窗口:专业隐私保护解决方案
  • GeoScene+人大金仓使用方法
  • 鸣潮终极解放指南:免费开源自动化工具让你5分钟搞定日常任务
  • Sapiens2与其他视觉Transformer对比分析:为什么它在人类中心任务中表现更优
  • 大模型备忘录
  • IndoBERT Large P2 OpenMind社区贡献指南:如何参与项目开发
  • 如何构建泛化能力强大的JoyTag模型:从Danbooru数据集到摄影图像识别
  • 从水印去除到隐写术分析:一次意外的数字追踪发现之旅
  • OneNET物联网平台实战:如何用MQTT.fx模拟设备与云端双向通信(附完整Topic规则解析)
  • AI功能如何拖慢核心产品增长?诊断与解决之道
  • AsymFLUX.2-klein-9B完全指南:从安装到生成惊艳图像的快速入门
  • Citra 3DS模拟器:如何在电脑上免费畅玩任天堂3DS经典游戏
  • 基于LangChain与RAG技术构建智能PDF问答系统
  • 避坑指南:在自建AI集群中,NCCL建图过程如何影响你的多卡训练性能?
  • 【vscode输出中文乱码】
  • MATLAB玩转RTL-SDR:从驱动安装到硬件支持包配置的保姆级避坑指南