目录
找字符类的题目比较简单,也很常见
一般思路就是利用字符对应的ASCII码表生成一个哈希表记录字符出现的次数
然后再根据题意进行查找
LeetCode1160.拼写单词
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
int sum = 0;
vector<int> v(26);
for(char ch:chars)
v[ch-'a']++;//构建一个哈希表
for(string &w:words){
vector<int> h(26);
int i;
for(i=0;i<w.size();i++){
if(++h[w[i]-'a']>v[w[i]-'a'])
break;
}
if(i>=w.size())
sum+=w.size();
}
return sum;
}
};
LeetCode1189.“气球”的最大数量
如果是Python的话可以直接用count计数超简洁
我用C++是就用哈希表计数,然后数一下比较
虽然思路比较笨,但是内存能击败100%,时间能击败93%
class Solution {
public:
int maxNumberOfBalloons(string text) {
//很明显的哈希表字符串类型的题
int a[26]={0};
for(int i=0;i<text.size();i++)
//数每个不同字母出现的次数
if(text[i]=='b'||text[i]=='a'||text[i]=='l'||text[i]=='o'||text[i]=='n')
a[text[i]-'a']++;
//比较b,a,l,n中单词最少的
int min1 = (1<<21);
if(a['a'-'a']<min1)
min1 = a['a'-'a'];
if(a['b'-'a']<min1)
min1 = a['b'-'a'];
if(a['l'-'a']<min1)
min1 = a['l'-'a'];
if(a['n'-'a']<min1)
min1 = a['n'-'a'];
//比较l和o中数字最小的
int min2 = a['l'-'a'];
if(a['o'-'a']<a['l'-'a'])
min2 = a['o'-'a'];
min2/=2;
if(min1<=min2)
return min1;
return min2;
}
};
class Solution {
public:
int maxNumberOfBalloons(string text) {
//很明显的哈希表字符串类型的题
int a[26]={0};
for(int i=0;i<text.size();i++)
if(text[i]=='b'||text[i]=='a'||text[i]=='l'||text[i]=='o'||text[i]=='n')
a[text[i]-'a']++;
//比较b,a,l,n中单词最少的
int min1 = (1<<21);
if(a['a'-'a']<min1)
min1 = a['a'-'a'];
if(a['b'-'a']<min1)
min1 = a['b'-'a'];
if(a['l'-'a']<min1)
min1 = a['l'-'a'];
if(a['n'-'a']<min1)
min1 = a['n'-'a'];
//比较l和o中数字最小的
int min2 = a['l'-'a'];
if(a['o'-'a']<a['l'-'a'])
min2 = a['o'-'a'];
min2/=2;
if(min1<=min2)
return min1;
return min2;
}
};
LeetCode451.根据字符出现的频率排序
我发誓,这种恶心的题目我很不想做;
看上去没什么用,实际就是没什么用
class Solution {
public:
string frequencySort(string s) {
unordered_map<char, int> charMap;
for (const auto ch : s) { charMap[ch]++; }
sort(s.begin(), s.end(), [&](const char ch1, const char ch2){ return charMap[ch1] == charMap[ch2] ? ch1 > ch2 : charMap[ch1] > charMap[ch2]; });
return s;
}
};
所有木桶计数的问题都可以使用map来代替
LeetCode169.多数元素
如果按照以往可定是使用木桶计数法来处理,但是数组的大小不好确定会很麻烦
所有木桶计数的问题都可以用map代替!
class Solution {
public:
int majorityElement(vector<int>& nums) {
map<int,int> m;
for(int i=0;i<nums.size();i++){
m[nums[i]]++;
if(m[nums[i]]>nums.size()/2)
return nums[i];
}
return 0;
}
};