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

★ 算法OJ题 ★ 力扣3 - 无重复字符的最长子串

Ciallo~(∠・ω< )⌒☆ ~ 今天,塞西莉亚将和大家一起做一道滑动窗口算法题-- 无重复字符的最长子串~

目录

一  题目

二  算法解析

三  编写算法


一  题目

3. 无重复字符的最长子串 - 力扣(LeetCode)

二  算法解析

解法⼀:暴力求解 + 哈希表

枚举从每⼀个位置开始往后,无重复字符的子串可以到达什么位置。找出其中长度最大的即可。

在往后寻找无重复子串能到达的位置时,可以利用哈希表统计出字符出现的频次,判断什么时候⼦串出现了重复元素。

时间复杂度:O(N ^ 2)

class Solution {
public:
	int lengthOfLongestSubstring(string s) {
		int ret = 0; // 记录结果
		int n = s.length();
		// 1. 枚举从不同位置开始的最⻓重复⼦串
		// 枚举起始位置
		for (int i = 0; i < n; i++)
		{
			// 创建⼀个哈希表,统计频次
			int hash[128] = { 0 };

			// 寻找结束为⽌
			for (int j = i; j < n; j++)
			{
				hash[s[j]]++; // 统计字符出现的频次
				if (hash[s[j]] > 1) // 如果出现重复的
					break;

				// 如果没有重复,就更新 ret
				ret = max(ret, j - i + 1);
			}
		}
		// 2. 返回结果
		return ret;
	}
};

解法二:滑动窗口

解法一可以通过以下优化,缩短时间复杂度:~

算法思路:

让滑动窗口满⾜:窗口内所有元素都是不重复的。

右端元素 ch 进⼊窗⼝的时候,哈希表统计这个字符的频次:

  • 如果这个字符出现的频次超过 1 ,说明窗⼝内有重复元素,那么就从左侧开始划出窗⼝, 直到 ch 这个元素的频次变为 1 ,然后再更新结果。
  • 如果没有超过 1 ,说明当前窗⼝没有重复元素,可以直接更新结果

时间复杂度:O(N)

三  编写算法

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128] = { 0 }; // 使⽤数组来模拟哈希表
        int left = 0, right = 0, ret = 0;
        int n = s.size();
        while(right < n)
        {
            hash[s[right]]++; // 进⼊窗⼝
            while(hash[s[right]] > 1) // 判断
            {
                // 出窗⼝
                hash[s[left]]--;
                left++;
            }
            ret = max(ret, right - left + 1); // 更新结果
            right++; // 让下⼀个元素进⼊窗⼝
        }
        return ret;
    }
};


http://www.kler.cn/news/293964.html

相关文章:

  • 百家云 BRTC:革新华为 HarmonyOS NEXT 系统的实时通信体验
  • ctfshow-php特性(web123-web150plus)
  • 安卓玩机工具-----ADB方式的刷机玩机工具“秋之盒”’ 测试各项功能预览
  • SpinalHDL之数据类型(一)
  • 【LeetCode】11.盛最多水的容器
  • UE4_后期处理_后期处理材质及后期处理体积三—遮挡物体描边显示
  • 网络安全与恶意攻击:如何应对?
  • 2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略 完整参考论文
  • Jenkins+Svn+Vue自动化构建部署前端项目(保姆级图文教程)
  • [数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别
  • 仿论坛项目--Kafka,构建TB级异步消息系统
  • IOS 20 发现界面(UITableView)歌单列表(UICollectionView)实现
  • 51单片机-第十二节-LCD1602液晶显示屏
  • MyBatis-Plus 框架 QueryWrapper UpdateWrapper 方法修复sql注入漏洞事件
  • 2024社区版IDEA springboot日志输出颜色
  • Excel数据导入MySQL数据库的完整指南
  • 4.6 Sensors -- useMouse
  • EmguCV学习笔记 C# 10.2 人脸识别 FaceRecgnizer类
  • 太速科技-基于Kintex-7 XC7K325T的FMC USB3.0四路光纤数据转发卡
  • 解决MongoDB创建用户报错command createUser requires authentication
  • 结合AI图片增强、去背景,如何更好的恢复旧照片老照片?
  • 一台电脑对应一个IP地址吗?‌探讨两台电脑共用IP的可能性
  • Oracle数据库使用和维护的技巧与经验
  • Elasticsearch文档值
  • 浅谈Servlet
  • Java Web —— 扩展(Maven高级)
  • Elasticsearch 基本语法使用
  • C++20中lambda表达式新增加支持的features
  • halcon图像怎么显示在我们指定的区域
  • 【项目二】C++高性能服务器开发——日志系统(各种适配器)