【LeetCode笔记】438. 找到字符串中所有字母异位词(Java、字符串、滑动窗口)

题目描述

  • 因为自己写的复杂度已经到了 O(n),就没有再参考题解的优化了
  • 更新:滑动窗口方法
    在这里插入图片描述

思路 & 代码

  • 用一个 int[ ] count 来存储当前判断子串的各字母出现次数
  • getCount():对当前子串,求 count,时间复杂度 O(n)
  • formatString():用 count 转换成当前子串的对比格式,时间复杂度 O(1)
  • 对比格式:如"abcccz" 变成 “a1b1c3z1”
  • 实际上,getCount只要使用两次即可:一次给 p,一次给 s 的第一个子串
  • 往后,s 的字串只需要对之前的 count 进行微小更新即可
class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ans = new ArrayList<>();int pLen = p.length();if(s.length() < pLen){return ans;}char[] sC = s.toCharArray();char[] pC = p.toCharArray();// p的formatint[] count = new int[26];getCount(pC, count);String formatP = formatString(count);// s的初始countcount = new int[26];getCount(s.substring(0, pLen).toCharArray(), count);// 0的处理String formatQ = formatString(count);if(formatQ.equals(formatP)){ans.add(0);}// 从1开始for(int i = 1; i + pLen <= s.length(); i++){char last = sC[i + pLen - 1];char pre = sC[i - 1];if(last != pre){count[last - 'a']++;count[pre - 'a']--;formatQ = formatString(count);   }if(formatQ.equals(formatP)){ans.add(i);}}return ans;}// 函数时间复杂度O(n)void getCount(char[] now, int[] count){for(char ch : now){count[ch - 'a']++;}}String formatString(int[] count){StringBuilder formatNow = new StringBuilder();for(int i = 0; i < 26; i++){if(count[i] != 0){formatNow.append((char)(i + 'a'));formatNow.append(count[i]);}}return formatNow.toString();}
}

更新版

  • 现在看之前的代码简直不堪入目…好长好冗余
  • 新思路:等大滑动窗口,数组维护滑动窗口值,Arrays.equals() 用作对比
class Solution {public List<Integer> findAnagrams(String s, String p) {if(s.length() < p.length()) {return new ArrayList<>();}int[] sCounts = new int[26];int[] pCounts = new int[26];List<Integer> ans = new ArrayList<>();for(int i = 0; i < p.length(); i++) {sCounts[s.charAt(i) - 'a']++;pCounts[p.charAt(i) - 'a']++;}if(Arrays.equals(sCounts, pCounts)) {ans.add(0);}int left = 0, right = p.length() - 1;while(right < s.length() - 1) {sCounts[s.charAt(left++) - 'a']--;sCounts[s.charAt(++right) - 'a']++;if(Arrays.equals(sCounts, pCounts)) {ans.add(left);}}return ans;}
}

三刷 - 每日一题

  • 滑动窗口,20行以内解决~
class Solution {public List<Integer> findAnagrams(String s, String p) {if(s.length() < p.length()) return new ArrayList<>();List<Integer> ans = new ArrayList<>();int[] sCounts = new int[26];int[] pCounts = new int[26];for(int i = 0; i < p.length(); i++) {sCounts[s.charAt(i) - 'a']++;pCounts[p.charAt(i) - 'a']++;}if(Arrays.equals(sCounts, pCounts)) ans.add(0);int left = 0, right = p.length() - 1;while(right < s.length() - 1) {sCounts[s.charAt(left++) - 'a']--;sCounts[s.charAt(++right) - 'a']++;if(Arrays.equals(sCounts, pCounts)) ans.add(left);}return ans;}
}

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

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

相关文章

西南大学计算机与信息科学学院陈武,学院副院长——陈武 - 计算机与信息科学学院 - Powered by 西南大学...

1998年7月&#xff0c;毕业于原西南师范大学计算机系&#xff0c;获工学学士&#xff1b;2004年7月&#xff0c;毕业于原西南师范大学计算机与信息科学学院&#xff0c;获工学硕士&#xff1b;2009年1月&#xff0c;毕业于贵州大学计算机学院&#xff0c;获工学博士。1998年7月…

电脑入门完全自学手册_电气自动化自学宝典——看过人人都是工程师

原标题&#xff1a;电气自动化自学宝典——看过人人都是工程师怎样快速成为一名电气自动化工程师呢&#xff1f; 对于一些对电气技术一无所知或略有一点基础的人来说&#xff0c;要想成为一名电气自动化工程师或达到相同的技术程度&#xff0c;有什么速成的方法吗&#xff1f;如…

【LeetCode笔记】213. 打家劫舍II(Java、动态规划)

文章目录题目描述思路 & 代码更新版题目描述 在 I 的基础上&#xff0c;分成两部分&#xff0c;再取 Max 就行 思路 & 代码 由题意可知&#xff1a;一种路线中&#xff0c;不能同时出现第一家和最后一家。那么好办了&#xff0c;直接分成两部分分别取&#xff1a;不…

天津科技大学计算机合资办学,天津科技大学计算机科学与信息工程学院介绍

计算机科学与信息工程学院成立于2003年&#xff0c;以本科教育为主&#xff0c;稳步发展研究生教育的二级教学单位。从2000年计算机系只具有一个计算机科学技术的本科专业发展到目前拥有计算机科学技术、网络工程、软件工程三个本科专业和一个计算机应用技术硕士学位授权点&…

jflash view log_塑胶产品上的“LOG”是怎么来的?

“LOG”就是我们生产出来的产品的品牌.可以是单一的字组成&#xff1b;可以是图案组成&#xff1b;也可以由字与图案一起组成。一种是我们用模具生产出来的,通过模具上加工的字体生产出来的“LOG”,从而表现在产品上。而用模具直接生产出来的“LOG”,模具上有把做“LOG”字体做…

【LeetCode笔记】337. 打家劫舍III(Java、树型动态规划)

文章目录题目描述思路 & 代码更新版题目描述 这年头当个小偷&#xff0c;都得会 dp 和二叉树了和前面的 I & II 有点不同&#xff0c;这次直接换了数据结构&#xff0c;写树来了。&#xff08;之后不会是图吧&#xff09;很厉害&#xff0c;第一次接触到树型的dp&…

西北工业大学计算机毕业论文,西北工业大学硕士论文开题报告应注意的事项

更多 / 育龙网核心提示:西北工业大学硕士论文开题报告应注意的事项:根据《研究生手册》的规定,研究生的论文选题报告最迟应于入学后第三学期结束前完成. 西北工业大学硕士论文开题报告应注意的事项一、开题报告根据《研究生手册》的规定,研究生的论文选题报告最迟应于入学后…

andriod studio 查看项目依赖_如何实施CRM项目管理

CRM 系统实施不当&#xff0c;不仅造成经济上的损失&#xff0c;而且会给企业的经营造成严重的影响&#xff0c;甚至导致崩溃。作为典型的高风险项目&#xff0c;CRM 系统实施必须进行严格的项目管理。而项目管理的内容非常丰富。下面简单描述CRM 项目管理中几个重要的方面。CR…

【LeetCode笔记】208. 实现Trie(前缀树)(Java、前缀树)

文章目录题目描述思路 & 代码更新版题目描述 属于那种&#xff0c;敲过一遍就不会忘了的那种题&#xff0c;就是学一个新的数据结构 二十六叉树&#xff01; 思路 & 代码 isEnd 非常重要噢&#xff0c;只有正式 insert 了的单词才能被 search 到。在 Trie 中实现内…

计算机的储存容量1kb等于多少byte,1M等于多少字节?

1M等于多少字节?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;1M等于多少字节?不是1M等于多少字节&#xff0c;是1MB等于多少字节。字节(Byte /bait/ n. [C])是计算机信息技术用于计量存…

初中数学503个必考知识点_2020年中考数学必考知识点公布,考生高分、满分提分必备神器...

在孩子学习过程中&#xff0c;假设有一种“方法”&#xff0c;能让孩子成绩突飞猛进&#xff0c;你想不想掌握&#xff1f;在孩子学习过程中&#xff0c;假设有一套“系统”&#xff0c;能让孩子主动喜欢上学习&#xff0c;你想不想拥有&#xff1f;在孩子学习过程中&#xff0…

【LeetCode笔记】538. 把二叉搜索树转换为累加树(Java、二叉搜索树、递归)

文章目录题目描述思路 & 代码更新版题目描述 注意是二叉搜索树&#xff0c;可以找出顺序&#xff01;有点类似中序遍历 思路 & 代码 思路&#xff1a;当前结点 root 带着父值一直走到最右边&#xff0c;再一个个累加右值更新 root.val rightSum&#xff0c;然后以…

计算机1.1n次方等于100,1的N次方等于1,那1.01的365次方是多少?小进步助你迎来闪光时刻...

茨威格在《人类群星闪耀时》的序言中说道&#xff1a;“在一个民族内部&#xff0c;总是需要有几百万人才能产生一个天才&#xff0c;同样&#xff0c;总是需要有无数的光阴无所谓的流逝&#xff0c;才能等到一个真正具有历史意义的时刻&#xff0c;一个人类群星闪耀的时刻出现…

如何修改ant-input的高度_水质自动采样器的流量计功能如何应用?

水质自动采样器一般都具有等比例采样功能&#xff0c;根据污水流量的多少来自动调节采样量&#xff0c;对于一些性能的采样器甚至会集成内置流量计功能&#xff0c;只要用户配套一个液位变送器就可以实现明渠污水流量计的功能&#xff0c;可以说是一物两用、一举两得&#xff0…

【LeetCode笔记】26. 删除有序数组中的重复项(Java、原地)

文章目录题目描述代码 & 思路题目描述 看到群友说今天的每日是简单题&#xff0c;我啪的一下就开刷了&#xff0c;很快啊&#xff01;注意点&#xff1a;原地 & O(1)空间 代码 & 思路 有点类似移动零&#xff0c;就是把右边的有效值&#xff0c;一个个往左边推…

linux内核深度解析_十年磨一剑,第一本龙芯平台的Linux内核书来了

《用“芯”探核&#xff1a;基于龙芯的Linux内核探索解析》是一本基于龙芯平台&#xff0c;结合源代码来探索和解析Linux-5.x内核的书。市面上解析Linux 内核的经典书籍已有不少&#xff0c;尤其是被称为Linux 内核领域的“四库全书”&#xff1a;《Linux 内核设计与实现》 《L…

服务器能记录远程访问用户嘛,bat记录远程桌面连接登录信息

1.记录远程桌面的连接登录日志方法&#xff1a;:RDPlog.bat:hu 20110201:记录登陆信息echo offset mnetstat -nfor /f "tokens4 delims: " %%i in (%m%^|find "3389") do set mstsc%%iecho %date% %time:~0,-3% %USERNAME% %mstsc% >> RDPlog.txt…

【LeetCode笔记】27. 移除元素(Java、原地)

文章目录题目描述思路 & 代码更新版题目描述 打卡每日&#xff5e;感觉和昨天的每日基本上一样&#xff0c;甚至还更简单&#xff08;简单题我重拳出击&#xff01;&#xff09; 思路 & 代码 就是维护一个 nowLen&#xff0c;再遍历一次即可。 class Solution {pu…

python入门之函数调用-python之函数入门

python之函数入门 一. 什么是函数 二. 函数定义, 函数名, 函数体以及函数的调用 三. 函数的返回值 四. 函数的参数 五.函数名->第一类对象 六.闭包 一,什么是函数 函数: 对代码块和功能的封装和定义 二. 函数定义, 函数名, 函数体以及函数的调用 我们使用def关键字来定义函数…

在线ajax测试,在线测试 - SosoApi,简单强大的api接口文档管理平台

背景&#xff1a;在实际项目开发协同过程中&#xff0c;特别是前后端由不同开发人员开发时&#xff0c;前端接口联调必须要等后端接口开发完成后才可以。这种方式使得前端极大的依赖于后端&#xff0c;使得原本可以并行的工作被阻塞了&#xff0c;特别是流程性质的功能。mock服…