字符串与哈希表力扣专题学习记录

  • 题目
  • 思路与算法
  • 代码实现
  • 写在最后

题目

    1. 字母异位词分组
    1. 无重复字符的最长子串
    1. 重复的DNA序列
    1. 最小覆盖子串

思路与算法

    1. 字母异位词分组 : 按照字母序排序后再映射即可
    1. 无重复字符的最长子串:标准滑窗+HashSet或者HashMap实现。
    1. 重复的DNA序列:同上,滑窗加HashMap实现。
    1. 最小覆盖子串:滑窗加HashMap实现,区别在于使用几个map来完成映射。

代码实现

  1. 字母异位词分组
class Solution {public:vector<vector<string>> groupAnagrams(vector<string>& strs) {map<string,vector<string>> anagram;vector<vector<string>> res;for (int i = 0; i < strs.size(); ++i) {// 拿到当前字符串,并按照字母序进行排序string str = strs[i];sort(str.begin(),str.end());// 如果无法在anagram中找到if (anagram.find(str) == anagram.end()) {vector<string> item;anagram.insert(make_pair(str,item));}anagram[str].push_back(strs[i]);}map<string,vector<string>>::iterator it;for (it = anagram.begin(); it != anagram.end(); ++it) {res.push_back((*it).second);}return res;}
};
  1. 无重复字符的最长子串
class Solution {public:int lengthOfLongestSubstring(string s) {if(s.size() == 0) return 0;unordered_set<char> lookup;int maxStr = 0;int left = 0;for(int i = 0; i < s.size(); i++){// 若之前出现过,此时需要移动左指针,直至出现一个全新的字符while (lookup.find(s[i]) != lookup.end()){lookup.erase(s[left]);left ++;}// 正常情况下直接更新当前最大值即可maxStr = max(maxStr,i-left+1);lookup.insert(s[i]);}return maxStr;}
};
  1. 重复的DNA序列
class Solution {public List<String> findRepeatedDnaSequences(String s) {HashSet<String> seen = new HashSet<>();HashSet<String> output = new HashSet<>();int len = s.length();int L = 10;for (int i = 0; i < len - L + 1; ++i) {String tmp_string = s.substring(i,i + L);if (seen.contains(tmp_string)) {output.add(tmp_string);}seen.add(tmp_string);}return new LinkedList<String> (output);}
}
  1. 最小覆盖子串
class Solution {public:unordered_map<char,int> ori,cnt;bool check(){for (const auto &p : ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {// 将要检索包含的字符扔进ori图计数for (const auto &c : t) {ori[c]++;}int l = 0, r = -1;int len = INT_MAX, ansL = -1;// 遍历while ( r < int(s.size()) ) {// 将s中与t中都出现过的字符计数存在cnt图中,存的是s中的字符和计数if ( ori.find(s[++r]) != ori.end() ) {cnt[s[r]]++;}// 满足s中出现的字符个数和种类都大于等于t中要求的,才能继续进行while (check() && l <= r) {// 满足要求,则更新满足要求的最小的len,同时更新ansLif (r - l + 1 < len) {len = r - l + 1;ansL = l;}// 此时左指针右移,判断是否还满足条件if (ori.find(s[l]) != ori.end()) {cnt[s[l]]--;}l++;}}return ansL == -1 ? string() : s.substr(ansL,len);}
};

写在最后

  1. 滑动窗口加Hash是非常常用的一种数据结构模式,和DFS以及BFS一样,非常的常用,务必熟练书写掌握。注意一些细节写法,例如隐含初始值,一般为-1。例如Java和Cpp中的map的使用的区别,哪个方便哪个来,不要拘泥死板,灵活使用。

20210501:字符串与哈希表力扣专题学习记录相关推荐

  1. 数据结构与算法笔记:哈希表——力扣389

    原题: 给定两个字符串 s 和 t ,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 思路: 首先咱们抛开编程知识,就当它是咱们日常 ...

  2. 力扣刷题记录--哈希表相关题目

    当遇到需要快速判断一个元素是否出现在集合里面的时候,可以考虑哈希法,牺牲一定的空间换取查找的时间. java常用的哈希表有HashMap.HashSet以及用数组去模拟哈希,这几种方法各有优劣. 数组 ...

  3. 力扣刷题记录_字符串(自学)

    字符串 一.字符串 1.反转字符串(力扣344) 2.反转字符串 II(力扣541) 3.替换空格(剑指 Offer 05) 4.翻转字符串里的单词(力扣151) 5.左旋转字符串(剑指 Offer ...

  4. 【LeetCode笔记】139. 单词拆分(Java、动态规划、字符串、哈希表)

    文章目录 题目描述 思路 & 代码 二刷更新 题目描述 漏网之题..一个月前写的居然没写博客 思路 & 代码 HashSet 存储 word,便于查询 动态规划三要素在注释中 思路:如 ...

  5. 力扣刷题记录-动态规划问题总结

    百度百科里对于动态规划问题是这样解释的: 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.因此各个阶段 ...

  6. 力扣刷题记录-回溯算法相关题目

    首先介绍一下回溯算法 回溯通常在递归函数中体现,本质也是一种暴力的搜索方法,但可以解决一些用for循环暴力解决不了的问题,其应用有: 1.组合问题: 例:1 2 3 4这些数中找出组合为2的组合,有1 ...

  7. 力扣算法学习计划打卡:第六天

    3无重复字符的最长子串,567 字符串的排列 无重复字符的最长子串 滑动窗口/双指针 func max(a,b int)int{if a<b{return b}return a }func le ...

  8. 力扣刷题记录--位运算问题

    这里写目录标题 一.n&(n-1) 1. 求一个数的二进制表示中的1的个数 力扣 191. 位1的个数 AcWing 801. 二进制中1的个数 2. 判断一个数是否是2的方幂 二.n& ...

  9. 力扣刷题记录-单调栈相关题目

    单调栈是指栈里的元素保持升序或者降序. 判别是否需要使用单调栈:通常是一维数组里面,需要寻找一个元素左边或者右边第一个比自己大或者小的元素的位置,则可以考虑使用单调栈:这样的时间复杂度一般为O(n). ...

最新文章

  1. 通过DataTable导出Excel
  2. boost::safe_numerics模块实现测试添加 constexpr
  3. activiti dmn_端到端BPM(带有DMN标记)
  4. 433M无线串口E30-TTL-100在农业物联网上的应用
  5. 将 nginx 安装成 windows 的方法
  6. Shamir密钥分享算法 python实现
  7. Hexo NexT主题添加点击爱心效果
  8. css中如何将a标签设置居中,cssa标签设置成block后,怎么让文字垂直居中_html/css_WEB-ITnose...
  9. VC6生成Release版本程序
  10. hadoop 文件上传
  11. linux增加分区大小,新增硬盘扩容Linux下的分区大小
  12. 计算机在服装生产中的应用情况,【服装设计论文】服装设计中计算机信息技术的运用(共1730字)...
  13. 论文笔记:CVPR2021 Bottom-Up Shift and Reasoning for Referring Image Segmentation
  14. 盘点华为“天才少年”中的神仙女孩纸~
  15. JS 实战: Drag 点击拖曳效果
  16. Mac中文件夹重命名快捷键
  17. 【电子电路】五款单按键开关机电路图
  18. matlab中的a‘与a.‘的不同之处
  19. 利用USRP探索软件无线电(3)
  20. css sass的@mixin 与 @include引用

热门文章

  1. 网易发“暴力裁员”内部说明;京东负责不幸员工的孩子费用到22岁;Linux kernel 5.4发布 | 极客头条...
  2. 为什么 Java 进程使用的 RAM 比 Heap Size 大?​ | CSDN博文精选
  3. 反转!物联网火爆,开发技术却遇瓶颈!
  4. 拿走不谢:一份历经线上考验的大规模系统的消息队列技术方案!
  5. IBM 确认裁员约 1700 人;华为新款操作系统来了!开通 5G 服务不换卡不换号 | 极客头条...
  6. 从初级程序员逆袭为技术大牛,你需要懂这 10 项技术!
  7. 互联网行业的体面隐退 | 畅言
  8. 走不远的共享滑板车!
  9. 蚂蚁金服双 11 大促全面揭秘:百万支付、容器化和平台智能化
  10. iOS 12 真的能让旧款 iPhone 速度飞起吗?