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

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

一、题目描述

给定两个字符串 s 和 p,找到 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
s 和 p 仅包含小写字母

二、解决思路

1、直观解法,for循环遍历原数组,每次截取p长度,判断是否是异位词

class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> list = new LinkedList<>();if(s == null || p == null || s.length() == 0 || p.length() == 0){return list;}if(p.length() > s.length()){return list;}int count = p.length();String cur;char[] curChars;Set<String> set = new HashSet<>();//需转换为数组进行排序set.add(sortString(p));for(int i = 0;i < s.length() && i < s.length() - count + 1;i++){//截取不包含i+count位置的元素cur = s.substring(i,i + count);if(set.contains(sortString(cur))){list.add(i);}}return list;}//对一个字符串内部按字母排序,返回新字符串public String sortString(String str){char[] dest = str.toCharArray();Arrays.sort(dest);return String.valueOf(dest);}
}

在这里插入图片描述
2、滑动窗口
定长滑窗。枚举 s 的所有长为 n 的子串 s

,如果 s

的每种字母的出现次数,和 p 的每种字母的出现次数都相同,那么 s

是 p 的异位词。

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;}
}

在这里插入图片描述

http://www.xdnf.cn/news/8703.html

相关文章:

  • Python之两个爬虫案例实战(澎湃新闻+网易每日简报):附源码+解释
  • 力扣 54 .螺旋矩阵
  • 148. 排序链表
  • 40-智慧医疗服务平台(在线接/问诊/机器学习)
  • 电工杯数学建模竞赛a题完整参考文章
  • C++魔法药水的配方 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析
  • 深度学习模型在PDE求解中的实战:详细综述
  • 电磁场与电场、磁场的关系
  • React从基础入门到高级实战:React 基础入门 - React Hooks 入门
  • 状态码··
  • 【go】程序启动时发生了什么?为什么选择go语言开发,优势劣势
  • 5.1/Q1,GBD数据库最新文章解读
  • 创新项目实训开发日志7
  • 【动态规划】简单多状态(一)
  • 77. Combinations
  • Qt实战:自定义QTreeWidget搜索隐藏显示项功能 | 附完整源码
  • 基于音频Transformer与动作单元的多模态情绪识别算法设计与实现(在RAVDESS数据集上的应用)
  • 算法、算力、数据哪个更重要
  • C#核心概念解析:析构函数、readonly与this关键字
  • java 代码查重(五)比较余弦算法、Jaccard相似度、欧式距离、编辑距离等在计算相似度的差异
  • 开发者工具箱-鸿蒙大小写转换开发笔记
  • H3C-WAF-单机部署
  • 【每天一个知识点】“数字人”(Digital Human)
  • Easy Dataset数据集构建使用
  • 解析 Flask 上下文机制:请求上下文、应用上下文
  • AI Agent开发第74课-解构AI伪需求的魔幻现实主义
  • 【c++】成员函数被声明为 `const` 时
  • Oracle 的SHRINK 操作实现原理
  • 软考学习中
  • Docker Swarm配置