[Java][算法 滑动窗口]Day 03---LeetCode 热题 100---08~09

第一题  无重复字符串的最长子串

思路

其实就是在字符串S中 找到没有重复的最长子串的长度  这道题的难点就是在于如何判断最长并且无重复

首先 最长长度  可以使用变量max记录保存   

再者 判断有无重复  最简单的方法就是  暴力遍历法  即对于每次找的子串都再次寻找遍历一次  判断是否已有字符  自然  这种方法判断的话 时间复杂度会不是一般的高

当然 算法优化我们慢慢再讨论  最直接的思路就是如此

解法一:暴力法

我们的暴力当然和上述思路不太一样  我们对于是否重复  可以直接利用Map集合key不能重复的特点  然后使用containKey()方法直接进行判断

class Solution {public static int lengthOfLongestSubstring(String s) {
// 对于S的特殊情况直接返回0if(s==null || s.length()==0) return 0;
//将S转化为char数组[]  遍历该数组 然后进行判断char[] charArray = s.toCharArray();int max=1;Map<Character,Integer> map=new HashMap<>();
//遍历  每次遍历开始就是认定为子串的起始字符for(int i=0;i< charArray.length;i++){
//每次记录完一次后 需要把map清空map.clear();map.put(charArray[i],i); //将第一个字符放入for(int j=i+1;j< charArray.length;j++){if(map.containsKey(charArray[j])){ // 利用containKey方法直接判断if(map.size()>max) max=map.size(); // 判断当前map长度和max进行比较break;}else{map.put(charArray[j],j);}}if(map.size()>max) max=map.size();}return max;}
}

解法二:滑动窗口法

所谓滑动窗口,其实就是在字符串中先选定一段,把这段作为一个可以滑动的窗口,这个窗口类似于队列,每次判断队列中字符是否满足题目条件,不满足即向左滑动(这是整体情况下 一般是向左  自然 也可以只会滑动右边界),滑动窗口的时候,自然左边会少一位,右边会多一位。

class Solution {public int lengthOfLongestSubstring(String s) {if (s.length()==0) return 0;HashMap<Character, Integer> map = new HashMap<Character, Integer>();int max = 0;int left = 0;for(int i = 0; i < s.length(); i ++){if(map.containsKey(s.charAt(i))){ //判断是否存在已有队列中
//有的话 找到map中该重复的元素的索引位置 判断两者索引大小 通过对索引的判断 不断向右滑动变化起点left = Math.max(left,map.get(s.charAt(i)) + 1);  }map.put(s.charAt(i),i);//不存在则添加到map中max = Math.max(max,i-left+1); // 更新最大长度}return max;}
}

第二题  找到字符串中所有字母异位词

思路

和第一题类似 也是遍历找子串  只是这个题目判断依据  不是重复 而是找异位词  异位词的定义我们之前也遇到过 简单来说 就是字母组成一样   如果是异位词 那么排序后的字符串两者一定是一样的  所以我们对其的判断方式就是排序后是否一样  那么这道题的解题思路就很明确

需要注意字符串长度  判null等特殊情况

解法一:暴力法

同样的 直接暴力遍历  然后判断是否为异位词就行即可

class Solution {public List<Integer> findAnagrams(String s, String p) {if(s==null||p.length()>s.length()) return new ArrayList<>();char[] pArray = p.toCharArray();Arrays.sort(pArray);ArrayList<Integer> list = new ArrayList<>();int i=0;int l=p.length();//   abvdef   abfor(i=0;i<=s.length()-l;i++){char[] sArray = s.substring(i, i + l).toCharArray();Arrays.sort(sArray);if(String.valueOf(pArray).equals(String.valueOf(sArray))){list.add(i);}}return list;}
}

我们是采用排序的方式进行判断异位词  当然也可以采用哈希表映射 统计字母次数的方式  代码如下

class Solution {public List<Integer> findAnagrams(String s, String p) {int sLen = s.length(), pLen = p.length();if (sLen < pLen) {return new ArrayList<Integer>();}List<Integer> ans = new ArrayList<Integer>();int[] sCount = new int[26];int[] pCount = new int[26];for (int i = 0; i < pLen; ++i) {++sCount[s.charAt(i) - 'a'];++pCount[p.charAt(i) - 'a'];}if (Arrays.equals(sCount, pCount)) {ans.add(0);}for (int i = 0; i < sLen - pLen; ++i) {--sCount[s.charAt(i) - 'a'];++sCount[s.charAt(i + pLen) - 'a'];if (Arrays.equals(sCount, pCount)) {ans.add(i + 1);}}return ans;}
}

解法二:滑动窗口法

我们不再分别统计滑动窗口和字符串 p 中每种字母的数量,而是统计滑动窗口和字符串 p 中每种字母数量的差;并引入变量 differ来记录当前窗口与字符串 p 中数量不同的字母的个数,并在滑动窗口的过程中维护它。

在判断滑动窗口中每种字母的数量与字符串 ppp 中每种字母的数量是否相同时,只需要判断 differ是否为零即可

class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> res = new ArrayList<Integer>();int sLen = s.length();int pLen = p.length();if(sLen < pLen) {return res;}//表示字母出现次数差距//count[x] = 0  表示 s与p中字母x出现次数相同 都出现了n次(n>=0)//count[x] = n  表示 在s中字母x出现次数比p多 多出现了n次(n>0)//count[x] = -n 表示 在s中字母x出现次数比p少 少出现了n次(n>0)int[] count = new int[26];for(int i = 0; i < pLen; i++){++count[s.charAt(i)-'a'];--count[p.charAt(i)-'a'];}//表示字母差异个数int differ = 0;for(int j = 0; j < 26; j++){if(count[j]!=0)++differ;}if(differ==0){res.add(0);}//向右滑动for(int i = 0; i < sLen - pLen; i++){//缩减时只考虑count[x]==1与count[x]==0的情况//因为缩减时字母x减少,count[x]会减去1//(1)count[x]==1时(次数差距1次,不相同)  //count[x]==0 -> 次数相同 -> 不相同变相同,字母差异个数减少1 -> differ--//(2)count[x]==0时(次数相同)  //count[x]==-1 -> 次数差距变为1次->相同变不相同 ,字母差异个数增加1 -> differ++//(3)count[x]==-1时(次数不相同) -> count[x]==-2 次数还是不相同-> 字母差异数不变//(4)count[x]==2时(次数不相同)  -> count[x]==1 次数还是不相同-> 字母差异数不变//左缩减一位,iif (count[s.charAt(i) - 'a'] == 1) {  //窗口中s子串左边减少一个s[i]的数量(把原来多出来的1个s[i]去掉,变得相同)//两个字符串字母差距缩小--differ;} else if (count[s.charAt(i) - 'a'] == 0) {  //窗口中s子串左边减少一个s[i]的数量(把原来相同数量的s[i]的减少了1个,数量变得不相同)//两个字符串字母差距增大++differ;}//窗口中s子串左边减少一个字母s[i]--count[s.charAt(i) - 'a'];//添加时只考虑count[x]==-1与count[x]==0的情况,原因分析与缩减时类似//右添加一位,i+pLenif (count[s.charAt(i + pLen) - 'a'] == -1) {  //窗口中s子串右边增加一个s[i+pLen]的数量(把原来缺少的1个s[i]加上,数量变得相同)//两个字符串字母差距缩小--differ;} else if (count[s.charAt(i + pLen) - 'a'] == 0) {  //窗口中s子串右边增加一个s[i+pLen]的数量(把原来相同数量的s[i]多加了1个,变得不相同)//两个字符串字母差距增大++differ;}//窗口中s子串右边增加一个字母s[i+pLen]++count[s.charAt(i + pLen) - 'a'];//两个字符串字母差距为0if (differ == 0) {res.add(i + 1);}}return res;  }
}

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

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

相关文章

《辽宁春晚》开场动画惊艳亮相,蓝海创意云渲染服务再显神通

随着2024年甲辰龙年的脚步日益临近&#xff0c;备受瞩目的《辽宁春晚》于除夕夜为全国观众带来了一场精彩绝伦的视听盛宴。作为整场晚会的亮点之一&#xff0c;开场动画以其独特的创意和精美的画面效果&#xff0c;为观众带来了一个难忘的视觉体验。而这一精彩的呈现&#xff0…

测试物理网络的ping命令

通过发送Internet控制消息协议&#xff08;ICMP&#xff09;并接收其应答&#xff0c;测试验证与另一台TCP/IP计算机的IP级联通性、可达到性和名称解析的疑难问题主要TCP/IP命令。如果不带参数&#xff0c;ping将显示帮助。通过在命令提示符下输入“ping /&#xff1f;”命令&a…

R语言课程论文-飞机失事数据可视化分析

数据来源&#xff1a;Airplane Crashes Since 1908 (kaggle.com) 代码参考&#xff1a;Exploring historic Air Plane crash data | Kaggle 数据指标及其含义 指标名 含义 Date 事故发生日期(年-月-日) Time 当地时间&#xff0c;24小时制&#xff0c;格式为hh:mm Locat…

CCF GESP 2024年3月认证时间及费用价格

1、认证语言&#xff1a; C/Python/图形化编程 2、报名及缴费时间&#xff1a; 2024年1月18日17点至3月5日24点截止 3、认证时间&#xff1a; 1-4级 2024年3月16日 上午09:30-11:30 5-8级 2024年3月16日 下午13:30-16:30 4、认证方式&#xff1a; 全国各GESP考点内上…

在客户端隔离的情况下通过 airtun-ng 实现直接客户端注入

直接的客户端注入技术 当我们试图执行一次无线攻击时&#xff0c;一个常见的问题就是&#xff0c;网络上的AP接入点拒绝在攻击者和被攻击者之间互转他们之间的攻击数据包。这种拒绝担任“中继”(relay)角色&#xff0c;而避免网络客户端之间互相攻击的技术&#xff0c;被称为“…

实例观察 c 语言中 volatile 的作用

volatile 意思是易变的。 在 c 语言中&#xff0c;如果变量被 volatile 修饰&#xff0c;就是告诉编译器这个变量随时都可能发生变化&#xff0c;那么每次读取变量的时候都会到内存中读取。 如果变量没有被 volatile 修饰&#xff0c;并且编译器发现在多次读取变量之间&#…

备战蓝桥杯---图论之建图基础

话不多说&#xff0c;直接看题&#xff1a; 首先&#xff0c;这个不是按照字典序的顺序&#xff0c;而是以只要1先做&#xff0c;在满足后让2先做。。。。 就是让数字小的放前面做拓扑排序。 我们可以先做1&#xff0c;看看它的前驱。 举个例子&#xff1a; 我们肯定要把1放…

JVM常见问题笔记分享

文章目录 1 JVM组成1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;1.2 什么是程序计数器&#xff1f;1.3 你能给我详细的介绍Java堆吗?元空间(MetaSpace)介绍 1.4 什么是虚拟机栈1.5 堆和栈的区别1.6 能不能解释一下方法区&#xff1f;1.5.1 概述1.5.2 常量池1…

项目一:高并发内存池

1. 项目介绍 1.1 这个项目是做什么的 当前项目是实现一个高并发的内存池&#xff0c;他的原型是 google 的一个 开源项目tcmalloc &#xff0c; tcmalloc 全称 Thread-Caching Malloc &#xff0c;即线程缓存的 malloc &#xff0c;实现了高效的多线程内存管理&#xff0c;用…

蓝桥杯备赛_python_BFS搜索算法_刷题学习笔记

1 bfs广度优先搜索 1.1 是什么 1.2怎么实现 2案例学习 2.1.走迷宫 2.2.P1443 马的遍历 2.3. 九宫重排&#xff08;看答案学的&#xff0c;实在写不来&#xff09; 2.4.青蛙跳杯子&#xff08;学完九宫重排再做bingo&#xff09; 2.5. 长草 3.总结 1 bfs广度优先搜索 【P…

1.初识Tauri

文章目录 一、前言二、基本认识三、js与rust通信四、构建应用 一、前言 原文以及后续文章可点击查看&#xff1a;初识Tauri。 Tauri是一款比较新的跨平台桌面框架&#xff0c;也是我目前最喜欢的一个框架&#xff0c;其官网为&#xff1a;Tauri 它的作用其实和Electron很像&…

【PyQt】在PyQt5的界面上集成matplotlib绘制的图像

文章目录 0 前期教程1 概述2 matplotlib2.1 库导入2.2 图片的各个部分解释2.3 代码风格2.4 后端 3 集成matplotlib图像到pyqt界面中3.1 使用到的模块3.2 理解Qt Designer中的“控件提升”3.3 界面与逻辑分离的思路3.4 扩展 0 前期教程 【PyQt】PyQt5进阶——串口上位机及实时数…

transformer-Attention is All You Need(一)

1. 为什么需要transformer 循环模型通常沿输入和输出序列的符号位置进行因子计算。通过在计算期间将位置与步骤对齐&#xff0c;它们根据前一步的隐藏状态和输入产生位置的隐藏状态序列。这种固有的顺序特性阻止了训练样本内的并行化&#xff0c;这在较长的序列长度上变得至关重…

STM32-开发工具

开发过程中可能用到的工具 1、烧录下载调试工具ST-LINK ST-LINK&#xff0c;是ST(意法半导体)推出的调试编程工具&#xff0c;适用于STM32系列芯片的USB接口的下载及在线仿真器。 2、串口调试工具/串口下载工具 串口调试工具是一种用于通过串口通信协议与目标设备进行数据交…

源码网打包,目前有3000多个资源

源码网打包&#xff0c;目前有3000多个资源 需要赶快下手吧&#xff0c;到手可以使用&#xff0c;搭建好和本站一样&#xff0c;全网唯一 优化缩略图演示&#xff1a;https://www.htm.ink默认缩略图演示&#xff1a;https://blog.htm.ink网站截图

c入门第十六篇——学生成绩管理系统

师弟&#xff1a;“师兄&#xff0c;我最近构建了一个学生成绩管理系统&#xff0c;有空试用一下么&#xff1f;” 我&#xff1a;“好啊&#xff01;” 一个简单的学生成绩管理系统&#xff0c;基本功能包括&#xff1a;添加学生信息、显示所有学生信息、按学号查找学生信息、…

网络安全习题集

第一章 绪论 4 ISO / OSI 安全体系结构中的对象认证安全服务使用&#xff08; C ) 机制来完成。 A &#xff0e;访问控制 B &#xff0e;加密 C &#xff0e;数字签名 D &#xff0e;数据完整性 5 身份鉴别是安全服务中的重要一环&#xff0c;以下关于身份鉴别的叙述不正确的是…

const--类的常量成员函数

在C中,为了禁止成员函数修改数据成员的值,可以将它设置为常量成员函数。设置常量成员函数的方法是在函数原型的后面加上const,形式如下: class x { …………… T f(t1,t2) const{} ………… }; 常量成员函数的作用&#xff1a; 将成员函数设置为const&#xff0c;表明该成员函…

FMEA的六大分类——SunFMEA软件

FMEA是一种预防性的质量工具&#xff0c;通过对产品设计或过程的故障模式进行分析&#xff0c;评估其可能产生的影响&#xff0c;从而采取相应的措施来降低产品的故障风险。根据分析的范围和目的&#xff0c;FMEA可以分为以下几种类型&#xff0c;今天sun fmea软件系统和大家一…

理解孟子思想,传承中华文化

为了更好地了解和传承中华文化&#xff0c;加深对孟子思想的认识与理解&#xff0c;探究孟子思想在现代社会的传承与发展&#xff0c;2024年2月18日&#xff0c;曲阜师范大学计算机学院“古韵新声&#xff0c;格物致‘知’”实践队队员崔本迪在山东省泰安市东平县进行了深入的调…