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

438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词

已解答

中等

给定两个字符串 sp,找到 s 中所有 p 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

提示:

  • 1 <= s.length, p.length <= 3 * 104
  • sp 仅包含小写字母

题解:

class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ans = new ArrayList<>();int[] cntP = new int[26]; // 统计 p 的每种字母的出现次数int[] cntS = new int[26]; // 统计 s 的长为 p.length() 的子串 s' 的每种字母的出现次数for (char c : p.toCharArray()) {cntP[c - 'a']++; // 统计 p 的字母}for (int right = 0; right < s.length(); right++) {cntS[s.charAt(right) - 'a']++; // 右端点字母进入窗口int left = right - p.length() + 1;if (left < 0) { // 窗口长度不足 p.length()continue;}if (Arrays.equals(cntS, cntP)) { // s' 和 p 的每种字母的出现次数都相同ans.add(left); // s' 左端点下标加入答案}cntS[s.charAt(left) - 'a']--; // 左端点字母离开窗口}return ans;}
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/2969498/liang-chong-fang-fa-ding-chang-hua-chuan-14pd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

核心思路:两个字符串是异位词的充要条件是:它们包含的字符种类和每种字符的数量完全相同。例如"abc""cba"是异位词(都有 1 个a、1 个b、1 个c),而"abd""abc"不是(字符dc不同)。

使用两个长度为 26 的数组(对应 26 个小写字母):

  • cntp:记录字符串p中每个字符的出现次数(如cntp[0]表示'a'的数量,cntp[1]表示'b'的数量,以此类推)。
  • cnts:记录当前滑动窗口内(s的子串)每个字符的出现次数。

代码关键解读

步骤 1:初始化cntp数组

遍历p的每个字符,统计其出现次数并存储到cntp中:

for (char c : p.toCharArray()) {cntp[c - 'a']++;  // 'a'-'a'=0,'b'-'a'=1,映射到数组索引
}
步骤 2:滑动窗口遍历s,实时维护cnts数组

right指针从 0 开始遍历s,同时通过left指针维护一个长度为p.length()的滑动窗口:

  • 扩展窗口右侧:将s[right]加入当前窗口,更新cnts数组(对应字符计数 + 1):
cnts[s.charAt(right) - 'a']++;
  • 确定窗口左侧边界:当right足够大时(窗口长度等于p的长度),计算left
int left = right - p.length() + 1;  // 窗口起始索引 = 结束索引 - 窗口长度 + 1
  • 判断窗口是否有效
    • left < 0:窗口长度不足p.length(),继续扩展右侧(不做判断)。
    • left >= 0:窗口长度恰好等于p.length(),此时比较cntscntp
      • 若两者相等:当前窗口是p的异位词,记录left到结果列表。
      • 无论是否相等,都需要将窗口左侧的字符移出(cnts对应计数 - 1),为下一次窗口滑动做准备:
cnts[s.charAt(left) - 'a']--;  // 移除窗口左侧字符

http://www.dtcms.com/a/590546.html

相关文章:

  • 安全的响应式网站建设asp服装网站源码
  • 学做网站用谁的书个人二级网站怎么做
  • 高频面试八股文用法篇(十三)如何解决浮点数运算的精度丢失问题
  • 配置了iis打不开网站贵州建设网老网站
  • 网站安全监测预警平台建设成效seo大神做的网站
  • 什么是网站主办者广告设计公司工作规范流程
  • 聚美优品网的网站建设情况网站开发组合 lamp
  • 我与C++的一面之缘
  • 长沙快速建站模板上海广告传媒公司一览表
  • 做网站的公司介绍网站开发相关书籍
  • 微网站php源码数据线厂家东莞网站建设
  • 应用网站制作工程承包合作协议书
  • C# OpenVinoSharp部署DEIMv2
  • 给一个网站做需求分析动漫做的游戏 迅雷下载网站
  • 海南响应式网站建设哪里好当面付 wordpress插件
  • 【multi-model】moco系列SimCLRBEiT
  • VLA模型和世界模型知识总结
  • 找人做网站属于了解些什么呢大连外协机械加工网
  • 邯郸网站建设哪儿好做同城相亲网站
  • 长沙免费建站模板软件开发的收官之战是什么
  • 假冒建设厅网站wordpress同步微信素材
  • 高校网站建设情况报告范文免费建站网站大全
  • 网站开发税收分类长沙有名的公司
  • 帮企网站建设简洁大气企业网站源码
  • 佛山知名网站建设公司承德网站制作报价
  • 电力设备高盐雾环境腐蚀状态智能监测与防护策略优化
  • 网站建设公司信科网络南京做网站seo的
  • 瓯海住房与城乡建设局网站dw网页设计案例
  • Dev-C++的Compiler Options在哪里?
  • 地板网站建设国外网站建设接单