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

常见算法题目2 - 给定一个字符串,找出其中最长的不重复子串

算法题目2 - 给定一个字符串,找出其中最长的不重复子串

1. 问题描述

给定一个字符串,输出其最长的不重复子串,例如:

String str = "ababc";
输出:
abc

以下根据两种搜索算法。

2. 算法解决

2.1 暴力循环法

通过暴力循环搜索,时间负责度为O(n^3),效率低,代码如下:

/*** 题目:给定一个字符串,找出其中最长的不重复子串* 暴力法 时间复杂度 O(n^3)* @param str* @return*/private static String longestNoRepStr1(String str) {String result = "";if (str == null || str.length() == 0) {return result;}for (int i = 0; i < str.length(); i++) {for (int j = i; j < str.length(); j++) {// 判断子串是否重复 重复则跳出内层循环if (isRepStr(str, i, j)) {break;}// 不重复则截取比较长度 保留长的String subStr = str.substring(i, j + 1);if (subStr.length() > result.length()) {result = subStr;}}}return result;}
2.2 滑动窗口法

滑动窗口法借助左、右两个指针滚动判断,效率高,时间复杂度为O(n),代码如下:

 /*** 题目2:给定一个字符串,找出其中最长的不重复子串* 滑动窗口法 时间复杂度  O(n)* @param str* @return*/private static String longestNoRepStr2(String str) {String result = "";if (str == null || str.length() == 0) {return result;}// 左指针int left = 0;// 存储当前最大长度int maxLength = 0;// 存储当前窗口的元素下标Map<Character, Integer> characterMap = new HashMap<>();// 右指针滑动for (int right = 0; right < str.length(); right++) {char c = str.charAt(right);// 如果当前字符重复if (characterMap.containsKey(c)) {// 左指针右移left = Math.max(left, characterMap.get(c) + 1);}// 存储当前字符characterMap.put(c, right);// 当前字符串长度int currentLength = right - left + 1;// 保留长的if (currentLength > maxLength) {maxLength = currentLength;result = str.substring(left, right + 1);}}return result;}

3. 测试

调用测试:

public class LongestNoRepStrTest {public static void main(String[] args) {String str = "ababcd";// 暴力解法String result1 = longestNoRepStr1(str);System.out.println("最长不重复子串,暴力循环法结果:" + result1);System.out.println("====================");// 滑动窗口法String result2 = longestNoRepStr2(str);System.out.println("最长不重复子串,滑动窗口法结果:" + result2);}}

打印结果:
在这里插入图片描述
可见,输出结果一致

相关文章:

  • MySQL慢日志——动态开启
  • (15)关于窗体的右键菜单的学习与使用,这关系到了信号与事件 event
  • 《C 语言内存函数超详细讲解:从 memcpy 到 memcmp 的原理与实战》
  • vue——v-pre的使用
  • 安装openEuler操作系统
  • 强者的本质是什么?
  • Leetcode 2792. 计算足够大的节点数
  • mysql语句执行流程
  • Femap许可证升级说明
  • LTSPICE仿真电路:(二十九)T型反馈比例器
  • VirtualBox 4.3.10 经典版安装教程 - Windows 7/10 下载与设置指南
  • ASUS华硕ROG枪神9P笔记本G815LP(G615LW,G635LR,G835LX)原装出厂Win11系统,开箱状态oem系统
  • CAU人工智能class4 批次归一化
  • leetcode3434. 子数组操作后的最大频率-medium
  • JavaSE核心知识点03高级特性03-01(集合框架)
  • docker镜像操作
  • 什么是Express
  • LeRobot 框架的开发指南 (上)
  • 垒球百科全书·棒球1号位
  • 精度不够?光纤激光尺0.2ppm误差解锁微米级制造
  • 关于网站建设相关文章/网站模板下载
  • 制作一个简单网站的代码/网络热词的利弊
  • 建设人才库网站/免费seo工具汇总
  • ubuntu配置wordpress/淘宝关键词优化工具
  • 邢台市路桥建设公司网站/企业培训课程分类
  • wordpress 信息查询插件/seo短视频网页入口引流网站