classSolution{public:intlongestPalindrome(std::string s){int char_map[128]={0};int max_length =0;int flag =0;for(int i =0; i < s.length(); i++){
char_map[s[i]]++;}for(int i =0; i <128; i++){if(char_map[i]%2==0){
max_length += char_map[i];}else{
max_length += char_map[i]-1;
flag =1;}}return max_length + flag;}};
例2:词语模式(easy)(字串符哈希)
classSolution{public:boolwordPattern(string pattern, string s){
std::map<std::string,char> word_map;char used[128]={0};
std::string word;int pos =0;
s.push_back(' ');for(int i =0; i < s.length(); i++){if(s[i]==' '){if(pos == pattern.length()){returnfalse;}if(word_map.find(word)== word_map.end()){if(used[pattern[pos]]){returnfalse;}
word_map[word]= pattern[pos];
used[pattern[pos]]=1;}else{if(word_map[word]!= pattern[pos]){returnfalse;}}
word ="";
pos++;}else{
word += s[i];}}if(pos != pattern.length()){returnfalse;}returntrue;}};
classSolution:defwordPattern(self, pattern:str, s:str)->bool:
word2ch ={}
ch2word ={}
words = s.split()iflen(pattern)!=len(words):returnFalsefor ch, word inzip(pattern, words):if(word in word2ch and word2ch[word]!= ch)or(ch in ch2word and ch2word[ch]!= word):returnFalse
word2ch[word]= ch
ch2word[ch]= word
returnTrue
classSolution:defgroupAnagrams(self, strs):
result ={}
reslut_list=[]for i in strs:
list_i =[]for j inrange(len(i)):
list_i.append(i[j])
list_i.sort()ifstr(list_i)notin result:
result[str(list_i)]=[]
result[str(list_i)].append(i)else:
result[str(list_i)].append(i)for k,v in result.items():
reslut_list.append(v)print(reslut_list)if __name__ =="__main__":
s = Solution()
result = s.groupAnagrams(strs=["eat","tea","tan","ate","nat","bat"])print(result)
例4:无重复字符的最长子串(medium)(字符哈希)
classSolution{public:intlengthOfLongestSubstring(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;}};
classSolution(object):deflengthOfLongestSubstring(self, strs):"""
:type s: str
:rtype: int
"""
begin=0
result=0
word=""
char_dict={}for i inrange(len(strs)):if strs[i]notin char_dict:
char_dict[strs[i]]=1else:
char_dict[strs[i]]+=1if char_dict[strs[i]]==1:
word+=strs[i];if result<len(word):
result=len(word)else:while begin<i and char_dict[strs[i]]>1:
char_dict[strs[begin]]-=1
begin+=1
word=""foridinrange(begin,i+1):
word+=strs[id]return result
例5:重复的DNA序列(medium)(字串符哈希)
classSolution{constint L =10;public:
vector<string>findRepeatedDnaSequences(string s){
vector<string> ans;
unordered_map<string,int> cnt;int n = s.length();for(int i =0; i <= n - L;++i){
string sub = s.substr(i, L);if(++cnt[sub]==2){
ans.push_back(sub);}}return ans;}};
classSolution:deffindRepeatedDnaSequences(self, s:str)-> List[str]:
L =10
ans =[]
cnt = defaultdict(int)for i inrange(len(s)- L +1):
sub = s[i: i + L]
cnt[sub]+=1if cnt[sub]==2:
ans.append(sub)return ans
例6:最小窗口子串(hard)(哈希维护窗口)
classSolution{public:
string minWindow(string s, string t){constint MAX_ARRAY_LEN =128;int map_t[MAX_ARRAY_LEN]={0};int map_s[MAX_ARRAY_LEN]={0};
std::vector<int> vec_t;for(int i =0; i < t.length(); i++){
map_t[t[i]]++;}for(int i =0; i < MAX_ARRAY_LEN; i++){if(map_t[i]>0){
vec_t.push_back(i);}}int window_begin =0;
std::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++;}elseif(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;}private:boolis_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]]){returnfalse;}}returntrue;}};