数据结构与算法——哈希表与字符串
文章目錄
- 1.預(yù)備知識(shí)
- 1.1 最簡(jiǎn)單的哈?!y(tǒng)計(jì)字符個(gè)數(shù)
- 1.2 哈希表排序整數(shù)
- 1.3 哈希映射的問(wèn)題
- 2.最長(zhǎng)回文串
- 2.1 題目描述
- 2.2 C++代碼實(shí)現(xiàn)
- 3.單詞規(guī)律
- 3.1 題目描述
- 3.2 算法思路
- 3.3 C++代碼實(shí)現(xiàn)
- 4.字母異位詞分組
- 4.1 題目描述
- 4.2 算法思路
- 4.3 C++代碼實(shí)現(xiàn)
- 5.無(wú)重復(fù)字符的最長(zhǎng)子串
- 5.1 題目描述
- 5.2 算法思路
- 5.3 C++代碼實(shí)現(xiàn)
- 6.重復(fù)的DNA序列
- 6.1 題目描述
- 6.2 算法思路
- 6.3 C++代碼實(shí)現(xiàn)
- 7.最小覆蓋子串
- 7.1 題目描述
- 7.2 算法思路
- 7.3 C++代碼實(shí)現(xiàn)
1.預(yù)備知識(shí)
1.1 最簡(jiǎn)單的哈希——統(tǒng)計(jì)字符個(gè)數(shù)
1.題目描述
輸入一個(gè)字符串,輸出字符串中每個(gè)字符的個(gè)數(shù)
例如: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++代碼實(shí)現(xiàn)
class solution { public://1.最簡(jiǎn)單的哈希,輸入字符串,輸出字符串中重復(fù)字符的個(gè)數(shù)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 哈希表排序整數(shù)
1.題目描述
輸入:{999,1,444,7,20,9,1,3,7,7}
輸出:1,1,3,7,7,7,9,444,999
2.C++代碼實(shí)現(xiàn)
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 哈希映射的問(wèn)題
1.任意元素的哈希映射
2.哈希映射發(fā)生沖突
3.拉鏈法解決沖突問(wèn)題
2.最長(zhǎng)回文串
2.1 題目描述
給定一個(gè)包含大寫(xiě)字母和小寫(xiě)字母的字符串,找到通過(guò)這些字母構(gòu)造成的最長(zhǎng)的回文串。
在構(gòu)造過(guò)程中,請(qǐng)注意區(qū)分大小寫(xiě)。比如 “Aa” 不能當(dāng)做一個(gè)回文字符串。
示例 1:
輸入:
“abccccdd”
輸出:
7
解釋:
我們可以構(gòu)造的最長(zhǎng)的回文串是"dccaccd", 它的長(zhǎng)度是 7。
2.2 C++代碼實(shí)現(xiàn)
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.單詞規(guī)律
3.1 題目描述
給定一種規(guī)律 pattern 和一個(gè)字符串 str ,判斷 str 是否遵循相同的規(guī)律。
這里的 遵循 指完全匹配,例如, pattern 里的每個(gè)字母和字符串 str 中的每個(gè)非空單詞之間存在著雙向連接的對(duì)應(yīng)規(guī)律。
示例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" 輸出: false3.2 算法思路
3.3 C++代碼實(shí)現(xiàn)
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 題目描述
給定一個(gè)字符串?dāng)?shù)組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。
示例:輸入: ["eat", "tea", "tan", "ate", "nat", "bat"] 輸出: [["ate","eat","tea"],["nat","tan"],["bat"] ]4.2 算法思路
4.3 C++代碼實(shí)現(xiàn)
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.無(wú)重復(fù)字符的最長(zhǎng)子串
5.1 題目描述
給定一個(gè)字符串,請(qǐng)你找出其中不含有重復(fù)字符的 最長(zhǎng)子串 的長(zhǎng)度。
示例 1:輸入: s = "abcabcbb" 輸出: 3 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "abc",所以其長(zhǎng)度為 3。示例 2:輸入: s = "bbbbb" 輸出: 1 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "b",所以其長(zhǎng)度為 1。示例 3:輸入: s = "pwwkew" 輸出: 3 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "wke",所以其長(zhǎng)度為 3。請(qǐng)注意,你的答案必須是 子串 的長(zhǎng)度,"pwke" 是一個(gè)子序列,不是子串。示例 4:輸入: s = "" 輸出: 05.2 算法思路
5.3 C++代碼實(shí)現(xiàn)
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.重復(fù)的DNA序列
6.1 題目描述
所有 DNA 都由一系列縮寫(xiě)為 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸組成,例如:“ACGAATTCCG”。在研究 DNA 時(shí),識(shí)別 DNA 中的重復(fù)序列有時(shí)會(huì)對(duì)研究非常有幫助。
編寫(xiě)一個(gè)函數(shù)來(lái)找出所有目標(biāo)子串,目標(biāo)子串的長(zhǎng)度為 10,且在 DNA 字符串 s 中出現(xiàn)次數(shù)超過(guò)一次。
示例 1:輸入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 輸出:["AAAAACCCCC","CCCCCAAAAA"]示例 2:輸入:s = "AAAAAAAAAAAAA" 輸出:["AAAAAAAAAA"]6.2 算法思路
6.3 C++代碼實(shí)現(xiàn)
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 題目描述
給你一個(gè)字符串 s 、一個(gè)字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串,則返回空字符串 “” 。
注意:如果 s 中存在這樣的子串,我們保證它是唯一的答案。
示例 1:輸入:s = "ADOBECODEBANC", t = "ABC" 輸出:"BANC"示例 2:輸入:s = "a", t = "a" 輸出:"a"7.2 算法思路
7.3 C++代碼實(shí)現(xiàn)
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;} };總結(jié)
以上是生活随笔為你收集整理的数据结构与算法——哈希表与字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 牛客20701 神秘钥匙
- 下一篇: linux的基础知识——捕捉SIGCHL