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

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

https://leetcode.cn/problems/find-all-anagrams-in-a-string/

题目描述

在这里插入图片描述

题目分析

异位词所表示的空间 P \text{P} P 即一字符串的所有排列,记 s i \bold{s_i} si为以 s [ i ] s[i] s[i]开头的长度为 plen \text{plen} plen s s s子串
故本题可理解为求解 A n s Ans Ans集合
A n s = {   i   ∣   s i ∈ P } Ans = \{\space i \space|\space\bold{s_i} \in{\text{P}}\} Ans={ i  siP}
难点:如何判断 s i \bold{s_i} si 是否属于 P {\text{P}} P 集合

题目解法

思路1:通过sort函数可唯一确定一异位词空间,如此可以判断 s i \bold{s_i} si 是否属于题目要求的解空间 P {\text{P}} P

关键伪代码如下

sort(p);
for(...){
	temp <= s(i, plen);
	sort(temp);
	if(temp == p) ans.push(i);
}

思路2:通过count的方法唯一表示解空间

可以通过异位词的元素种类与对应个数唯一表示一异位词空间

代码如下

vector<int> findAnagrams(string s, string p) {
    int slen = s.length(), plen = p.length();
    vector<int> ans;
    if(s.length() < p.length()){
        return ans;
    }
    vector<int> hash_p(26);
    vector<int> hash_q(26);
    for(int i = 0; i < plen; ++i){
        ++hash_p[(p[i] - 'a')];
        ++hash_q[(s[i] - 'a')];
    }

    if(hash_p == hash_q) ans.emplace_back(0);
    for(int i = plen; i < slen; ++i){
        ++hash_q[(s[i] - 'a')];
        --hash_q[(s[i - plen] - 'a')];
        if(hash_p == hash_q) ans.emplace_back(i - plen + 1);
    }
    
    return ans;
}

总结

通过滑动窗口进行遍历,通过"hash"将字符串子串映射到异位词表示空间

每一个表示代表了一个异位词空间(一个字符串的所有元素的全排列)
广义上讲,以上方法都属于一种hash


http://www.kler.cn/a/319451.html

相关文章:

  • 物理设备命名规则(Linux网络服务器 15)
  • 如何在Puppeteer中实现表单自动填写与提交:问卷调查
  • react动态路由
  • 5G时代的关键元件:射频微波MLCCs市场前景广阔
  • Xcode 16 使用 pod 命令报错解决方案
  • 蓝牙BLE开发——iOS 每次写入数据超过200字节报错?
  • 2024 Snap 新款ar眼镜介绍
  • SDKMAN!关联已安装JDK
  • neo4j:ubuntu环境下的安装与使用
  • 胤娲科技:DeepMind的FermiNet——带你穿越“薛定谔的早餐桌”
  • uniapp 中uni.showModal添加输入框
  • 828华为云征文|华为云Flexus云服务器X实例部署immich相片管理系统
  • 接口自动化测试框架实战(Pytest+Allure+Excel)
  • unity CustomEditor的基本使用
  • vue3-vben-admin开发记录、知识点
  • 【多线程】面试高频考点!JUC常见类的详细总结,建议收藏!
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-24
  • 小孩真的需要手机上学吗?怎样远程了解他在学校用iPhone干什么?
  • 代码随想录 | Day24 | 二叉树:二叉树的公共祖先(有个自己的想法)二叉搜索树的公共祖先
  • Fyne ( go跨平台GUI )中文文档-小部件 (五)
  • VisualPromptGFSS
  • 【C++ Primer Plus习题】17.7
  • GEO数据库提取疾病样本和正常样本|GEO数据库区分疾病和正常样本|直接用|生物信息|生信
  • 使用宝塔部署项目在win上
  • MySQL数据库脚本转化成sqlite数据库脚本的修改点
  • 动态规划day38|322. 零钱兑换(背包满了吗?最小值怎么表示?)、279. 完全平方数、139. 单词拆分、多重背包要点、背包问题大总结