文章目录

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

数据结构与算法——哈希表与字符串相关推荐

  1. python hash表_python数据结构与算法——哈希表

    哈希表 学习笔记 参考翻译自:<复杂性思考> 及对应的online版本:http://greenteapress.com/complexity/html/thinkcomplexity00 ...

  2. 数据结构与算法——哈希表

    哈希表 看一个实际需求,google公司的一个上机题: 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址-)当输入该员工的id时,要求查找到该员工的所有信息. 要求: ...

  3. 【python】数据结构与算法—哈希表

    一.哈希表 用顺序表来存数据 存键值对时,通过哈希函数计算出键对应的索引,将值存到索引对应的数据区中 获取数据时,通过哈希函数计算出键对应的索引,将该索引对应的数据取出来 二.哈希冲突 对于任何哈希函 ...

  4. 第七章 哈希表与字符串

    文章目录 哈希表与字符串 哈希表基础知识 HashMap 基本使用 leetcoe 例1:最长回文串(409) 例2:词语模式(290) 例3:同字符词语分组(49) 例4:无重复字符的最长子串(3) ...

  5. 数据结构与算法Java(二)——字符串、矩阵压缩、递归、动态规划

    不定期补充.修正.更新:欢迎大家讨论和指正 本文以数据结构(C语言版)第三版 李云清 杨庆红编著为主要参考资料,用Java来实现 数据结构与算法Java(一)--线性表 数据结构与算法Java(二)- ...

  6. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  7. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  8. 数据结构实验:哈希表

    数据结构实验:哈希表 题目描述 在n个数中,找出出现次数最多那个数字,并且输出出现的次数.如果有多个结果,输出数字最小的那一个. 输入 单组数据,第一行数字n(1<=n<=100000). ...

  9. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

最新文章

  1. swift菜鸟入门视频教程-03-字符串和字符
  2. Java 的转义字符
  3. 添加gitlab远程账号 使用注意事项
  4. win10下装黑苹果双系统_win10远程双系统重装电脑维修7黑苹果笔记本安装做虚拟机服务mac8...
  5. Aswing入门教程 1.6 颜色和填充
  6. 十七、PHP框架Laravel学习笔记——模型的定义
  7. linux es数据库 head,Elasticsearch 5.3.x 使用 Head 插件
  8. oracle中decode的用法(例子)
  9. 拓端tecdat|使用R语言进行时间序列(arima,指数平滑)分析
  10. ubuntu 16.04 蓝牙鼠标 (可连接但是无法使用)
  11. python多线程中join()的理解
  12. 通达信资金净流入公式_主力净流入(副){51.63%/5655}
  13. 验证集和测试集的区别?
  14. 手机APP开发:学JAVA转安卓APP开发是不是很容易?
  15. Pytorch(GPU)配环境原理:cuda+cudnn+pytorch配环境的每一步到底干了些什么?
  16. 亲测有效:Steam 上的 Mountain 游戏设置为壁纸的方法
  17. 你可曾了解过,数据分析师与商业数据分析师?
  18. 相机多视角极线约束-小白必备
  19. 云南计算机专修学校附中,云南师范大学附属中学
  20. 【吃灰板子捡起来】按键输入实验

热门文章

  1. LeetCode 552. 学生出勤记录 II(动态规划)
  2. LeetCode 636. 函数的独占时间(栈)
  3. LeetCode 638. 大礼包(无限背包DP)
  4. LintCode 125. 背包问题 II(DP)
  5. 程序员面试金典 - 面试题 10.01. 合并排序的数组
  6. 程序员面试金典 - 面试题 01.02. 判定是否互为字符重排(哈希map)
  7. LeetCode 1026. 节点与其祖先之间的最大差值(二叉树DFS)
  8. android代理生命周期,了解 Activity 生命周期
  9. linux shell 输出日期格式,Linux下Shell日期的格式
  10. zeal刷新不出来_饥荒:游戏中的这些事物都是无中生有,几乎可以无限制刷新!...