数据结构与算法——哈希表与字符串

文章目录

    • 1.预备知识
      • 1.1 最简单的哈希——统计字符个数
      • 1.2 哈希表排序整数
      • 1.3 哈希映射的问题
    • 2.最长回文串
      • 2.1 题目描述
      • 2.2 C++代码实现
    • 3.单词规律
      • 3.1 题目描述
      • 3.2 算法思路
      • 3.3 C++代码实现
    • 4.字母异位词分组
      • 4.1 题目描述
      • 4.2 算法思路
      • 4.3 C++代码实现
    • 5.无重复字符的最长子串
      • 5.1 题目描述
      • 5.2 算法思路
      • 5.3 C++代码实现
    • 6.重复的DNA序列
      • 6.1 题目描述
      • 6.2 算法思路
      • 6.3 C++代码实现
    • 7.最小覆盖子串
      • 7.1 题目描述
      • 7.2 算法思路
      • 7.3 C++代码实现

1.预备知识

1.1 最简单的哈希——统计字符个数

1.题目描述

输入一个字符串,输出字符串中每个字符的个数
例如:simple_hash(“abcdefgaaxxy”)
输出:
[a][97]:3
[b][98]:1
[c][99]:1
[d][100]:1
[e][101]:1
[f][102]:1
[g][103]:1
[x][120]:2
[y][121]:1

2.C++代码实现

class solution {
public://1.最简单的哈希,输入字符串,输出字符串中重复字符的个数void simple_hash(string str){int char_map[128] = { 0 };for (int i = 0; i < str.length(); i++) {char_map[str[i]]++;}for (int i = 0; i < 128; i++) {if (char_map[i] > 0) {printf("[%c][%d]:%d\n", i, i, char_map[i]);}}}
};

1.2 哈希表排序整数

1.题目描述

输入:{999,1,444,7,20,9,1,3,7,7}
输出:1,1,3,7,7,7,9,444,999

2.C++代码实现

class solution {
public:vector<int> sort_hash(vector<int>& array){vector<int> result;int hash_map[1000] = {0};for (int i = 0; i < array.size(); i++) {hash_map[array[i]]++;}for (int i = 0; i < 1000; i++) {for (int j = 0; j < hash_map[i]; j++) {result.push_back(i);}}return result;}
};

1.3 哈希映射的问题

1.任意元素的哈希映射

在这里插入图片描述
2.哈希映射发生冲突

在这里插入图片描述
3.拉链法解决冲突问题

在这里插入图片描述

int solution::hash_func(int key, int table_len) {return key % table_len;
}
void solution::insert(ListNode* hash_table[], ListNode* node, int table_len) {int hash_key = hash_func(node->val, table_len);node->next = hash_table[hash_key];hash_table[hash_key] = node;
}
bool solution::search(ListNode* hash_table[], int value, int table_len) {int hash_key = hash_func(value, table_len);ListNode* head = hash_table[hash_key];while (head) {if (value == head->val) {return true;}head = head->next;}return false;
}

2.最长回文串

2.1 题目描述

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。

示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

2.2 C++代码实现

class Solution {
public:int longestPalindrome(string s) {int array[123]={0};int count=0;for(int i=0;i<s.size();i++){array[s[i]]++;if(array[s[i]]%2==0){count+=2;}}if(count<s.size()){count++;}return count;}
};

3.单词规律

3.1 题目描述

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

示例1:输入: pattern = "abba", str = "dog cat cat dog"
输出: true示例 2:输入:pattern = "abba", str = "dog cat cat fish"
输出: false示例 3:输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false示例 4:输入: pattern = "abba", str = "dog dog dog dog"
输出: false

3.2 算法思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3 C++代码实现

class Solution {
public:bool wordPattern(string pattern, string s) {map<string,char> word_map;int used[128]={0};string word;int pos=0;s.push_back(' ');for(int i=0;i<s.length();i++){if(s[i]==' '){if(pos==pattern.length()){return false;}if(word_map.find(word)==word_map.end()){if(used[pattern[pos]]==1){return false;}word_map[word]=pattern[pos];used[pattern[pos]]=1;}else{if(word_map[word]!=pattern[pos]){return false;}}pos++;word="";}else{word+=s[i];}}if(pos!=pattern.length()){return false;}return true;}
};

4.字母异位词分组

4.1 题目描述

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[["ate","eat","tea"],["nat","tan"],["bat"]
]

4.2 算法思路

在这里插入图片描述
在这里插入图片描述

4.3 C++代码实现

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {map<string,vector<string>> anagram;vector<vector<string>> result;for(int i=0;i<strs.size();i++){string str=strs[i];sort(str.begin(),str.end());if(anagram.find(str)==anagram.end()){vector<string> item;anagram[str]=item;}anagram[str].push_back(strs[i]);}map<string,vector<string>>::iterator it;for(it=anagram.begin();it!=anagram.end();it++){result.push_back((*it).second);}return result;}
};

5.无重复字符的最长子串

5.1 题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。示例 4:输入: s = ""
输出: 0

5.2 算法思路

在这里插入图片描述
在这里插入图片描述

5.3 C++代码实现

class Solution {
public:int lengthOfLongestSubstring(string s) {int begin=0;int result=0;string word="";int char_map[128]={0};for(int i=0;i<s.length();i++){char_map[s[i]]++;if(char_map[s[i]]==1){word+=s[i];if(result<word.length()){result=word.length();}}else{while(begin<i&&char_map[s[i]]>1){char_map[s[begin]]--;begin++;}word="";for(int j=begin;j<=i;j++){word+=s[j];}}}return result;}
};

6.重复的DNA序列

6.1 题目描述

所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。

编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。

示例 1:输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:["AAAAACCCCC","CCCCCAAAAA"]示例 2:输入:s = "AAAAAAAAAAAAA"
输出:["AAAAAAAAAA"]

6.2 算法思路

在这里插入图片描述

6.3 C++代码实现

class Solution {
public:vector<string> findRepeatedDnaSequences(string s) {map<string,int> word_map;vector<string> result;for(int i=0;i<s.length();i++){string word=s.substr(i,10);if(word_map.find(word)==word_map.end()){word_map[word]=1;}else{word_map[word]++;}}map<string,int>::iterator it;for(it=word_map.begin();it!=word_map.end();it++){if(it->second>1){result.push_back(it->first);}}return result;}
};

7.最小覆盖子串

7.1 题目描述

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。

注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 1:输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"示例 2:输入:s = "a", t = "a"
输出:"a"

7.2 算法思路

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.3 C++代码实现

class Solution {
public:bool is_window_ok(int map_s[],int map_t[],vector<int>& vec_t){for(int i=0;i<vec_t.size();i++){if(map_s[vec_t[i]]<map_t[vec_t[i]]){return false;}}return true;}string minWindow(string s, string t) {int map_s[128]={0};int map_t[128]={0};vector<int> vec_t;for(int i=0;i<t.length();i++){map_t[t[i]]++;}         for(int i=0;i<128;i++){if(map_t[i]>0){vec_t.push_back(i);}}int window_begin=0;string result;for(int i=0;i<s.length();i++){map_s[s[i]]++;while(window_begin<i){char begin_ch=s[window_begin];if(map_t[begin_ch]==0){window_begin++;}else if(map_s[begin_ch]>map_t[begin_ch]){map_s[begin_ch]--;window_begin++;}else{break;}}if(is_window_ok(map_s,map_t,vec_t)){int new_window_len=i-window_begin+1;if(result==""||result.length()>new_window_len){result=s.substr(window_begin,new_window_len);}}}return result;}
};

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

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

相关文章

Science重磅:DeepMind再获突破,用AI开启理解电子相互作用之路

来源&#xff1a;学术头条作者&#xff1a;青苹果编辑&#xff1a;hs排版&#xff1a;李雪薇当电子问题遇到了神经网络&#xff0c;会碰撞出什么样的火花呢&#xff1f;DeepMind 的最新研究向我们揭晓了答案。刊登在最新一期 Science 论文 Pushing the frontiers of density fu…

腾讯-地图:腾讯位置服务

ylbtech-腾讯-地图&#xff1a;腾讯位置服务1.返回顶部 2.返回顶部3.返回顶部4.返回顶部5.返回顶部 1、https://lbs.qq.com/product/miniapp/customized/2、6.返回顶部作者&#xff1a;ylbtech出处&#xff1a;http://ylbtech.cnblogs.com/本文版权归作者和博客园共有&#xff…

2022年六大值得关注的边缘计算趋势

来源&#xff1a; 边缘计算社区关于边缘计算的许多方面并不新鲜&#xff0c;但它仍在快速发展。例如&#xff0c;“边缘计算”包括已经存在了几十年的分布式零售商店分支系统。这个术语也包含了当地工厂和电信提供商计算系统的各种形式&#xff0c;尽管这是一种比历史规范更紧密…

RateLimiter的 SmoothBursty(非warmup预热)及SmoothWarmingUp(预热,冷启动)

SmoothBursty 主要思想 记录 1秒内的微秒数/permitsPerSencond 时间间隔interval,每一个interval可获得一个令牌 根据允许使用多少秒内的令牌参数&#xff0c;计算出maxPermits setRate时初始化下次interval时间&#xff0c;及storedPermits acquire时&#xff0c;计算当前now…

未来已来:全球XR产业洞察

来源&#xff1a;德勤Deloitte编辑&#xff1a;蒲蒲近日&#xff0c;德勤中国科技、传媒和电信行业推出元宇宙系列报告《元宇宙系列白皮书—未来已来&#xff1a;全球XR产业洞察》&#xff0c;聚焦XR产业发展趋势。报告指出&#xff0c;多元融合是元宇宙的演变趋势。在元宇宙发…

谷歌、哈佛联手绘出「百万分之一」人脑神经3D连接图!天量数据竟可塞满14亿块1T硬盘...

来源&#xff1a;神经科技编辑&#xff1a;Yezi审阅&#xff1a;mingzlee7前不久&#xff0c;谷歌和哈佛大学联手发布人脑神经3D连接图&#xff0c;涵盖人脑一百万分之一的信息&#xff0c;但数据已经塞满了1400块1T硬盘&#xff01;现在&#xff0c;这个研究团队表示&#xff…

python replace()

转载于:https://www.cnblogs.com/JackFang-X/p/11090449.html

解决表单提交的数据丢失问题

解决表单提交的数据丢失问题&#xff1a; 一、问题描述&#xff1a; 当我们在给前台页面设置修改功能的时候&#xff0c;因为有些信息是不允许进行修改的&#xff0c;所以在修改表单中没有相应的修改输入框&#xff0c;但是在修改表单的数据提交的时候&#xff0c;那些不允许修…

科学家即将揭示人类大脑神经网络结构的奥秘

来源&#xff1a;今日头条人类即将迎来了解大脑神经网络结构神秘世界的曙光&#xff01;哈佛大学神经科学家和谷歌工程师&#xff0c;发布了第一张人类大脑部分的神经网络连接图&#xff0c;大约针头大小的人类大脑组织用重金属染色&#xff0c;切成 5,000&#xff0c;并在电子…

温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...

来源&#xff1a;AI科技评论作者&#xff1a;Mr Bear编辑&#xff1a;青暮2021 年 10 月 13 日&#xff0c;来自麻省理工学院、加州大学伯克利分校、伊利诺伊大学香槟分校、华盛顿大学、帝国理工学院的六名顶级人工智能科学家、计算机视觉科学家在 ICCV 2021 大会期间进行了题为…

卷积神经网络(CNN)数学原理解析

来源&#xff1a;图灵人工智能作者&#xff1a;Piotr Skalski编辑&#xff1a;python数据科学原标题&#xff1a;Gentle Dive into Math Behind Convolutional Neural Networks翻 译&#xff1a; 通夜&#xff08;中山大学&#xff09;、had_in&#xff08;电子科技大学&#…

大脑研究正在挑战超级计算,“人脑计划”或需提前部署百亿亿级超级计算机...

来源&#xff1a;DeepTech深科技人脑的复杂性正推动着超级计算释放更多的潜力。据了解&#xff0c;人脑包含大约 860 亿个神经元&#xff0c;可形成数万亿个接触点。如果以细胞分辨率对整个大脑进行成像&#xff0c;甚至会产生数 PB 范围内的数据&#xff0c;这样的的计算量令人…

02 算术、字符串与变量(1)

本章内容 1、交互式命令shell 2、整数算术 3、浮点算术 4、其他数学函数 5、字符串 6、字符串拼接 7、获取帮助 8、类型转换 9、变量和值 10、赋值语句 11、变量如何引用值 12、多重赋值 -------------------------------------- 在学习Python前&#xff0c;我们需要了解数据类…

【数据结构基础】-线性表的顺序实现(数组实现)基本操作

2019.10.10 【数据结构-线性表的顺序结构】 基本操作&#xff1a;初始化&#xff0c;判断是否空表&#xff0c;清空表&#xff0c;获取表中的第i个元素&#xff0c;查找元素&#xff0c;插入元素&#xff0c;删除元素&#xff0c;获取表的元素个数。 抽象数据类型&#xff1a…

机器学习驱动技术是生物学进步的下一个突破

来源&#xff1a;ScienceAI作者&#xff1a;Immunai 联合创始人兼 CEO&#xff0c;Luis Voloch编译&#xff1a;绿萝数字生物学与 90 年代的互联网处于同一发展阶段&#xff08;早期、激动人心和变革性&#xff09;。当时&#xff0c;IP 地址的概念还很新&#xff0c;「精通技术…

实现调用API接口

API是一组封装好的函数&#xff0c;通过API&#xff0c;你可以为应用快速扩展功能&#xff0c;而无需理解它们是如何实现的&#xff0c;从而提升开发效率。通常&#xff0c;API服务商会提供API文档&#xff0c;那么如何根据文档来使用API呢&#xff1f; PS:该文章内容来自于阿里…

量子力学与机器学习相结合,预测高温下的化学反应

来源&#xff1a;ScienceAI编辑&#xff1a;凯霞在高温下从氧化物中提取金属不仅对于钢铁等金属的生产至关重要&#xff0c;而且对回收利用也必不可少。但当前的提取过程是碳密集型的&#xff0c;会排放大量温室气体。研究人员一直在探索开发「更绿色」的工艺方法。第一性原理理…

DeepMind提出强化学习新方法,可实现人机合作

来源&#xff1a;AI前线作者&#xff1a;Ben Dickson译者&#xff1a;盖策划&#xff1a;凌敏本文来自 BDTechTalks 网站的“AI 研究论文评论”专栏。该专栏提供人工智能最新发现的系列解读文章。尽管人工智能研究人员正力图建立能在围棋、星际争霸到 Dota 等复杂游戏中击败人类…

军事大脑的构建对未来战争的影响

前言&#xff1a;本文是我与军事科学院的赵蔚婷,王婉两位老师在2020年4月发表的一篇论文&#xff0c;首发在《中国科技论文在线》&#xff0c;是将互联网大脑模型与军事领域结合&#xff0c;形成军事大脑和军事超级智能的概念体系&#xff0c;重点提出军事神经元和军事云反射弧…

斯坦福抢开“元宇宙”第一课,上起来还真不便宜

过去半个世纪&#xff0c;斯坦福教给学生的技术&#xff0c;促成了硅谷的诞生&#xff1b;而为了将来的 Web3 时代&#xff0c;斯坦福也已经做好了准备。来源&#xff1a; 硅星人文&#xff1a;杜晨 编辑&#xff1a;VickyXiao今年10月底&#xff0c;硅谷顶级科技公司 Facebo…