算法打卡第二十二天,今天你刷题了吗
大家一起来刷题!
今日刷题重点----哈希表
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
输入: s = "anagram", t = "nagaram"
输出: true
输入: s = "rat", t = "car"
输出: false
由于字符串中的都是小写字母,所以我们可以用数组来作为Hash表.
bool isAnagram(string s, string t) {
int arr[30] = {0};
for(int i = 0;i < s.size();i++){
arr[s[i]-'a']++;
}
for(int i = 0;i < t.size();i++){
arr[t[i]-'a']--;
}
for(int i = 0;i <30;i++){
if(arr[i]){
return false;
}
}
return true;
}
使用sort后,判断两个字符串是否相等
bool isAnagram(string s, string t) {
if(s.size()!=t.size()){
return false;
}
sort(s.begin(),s.end());
sort(t.begin(),s.end());
if(s!=t){
return false;
}
return true;
}
为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。
给你一个赎金信 (ransomNote) 字符串和一个杂志(magazine)字符串,判断 ransomNote 能不能由 magazines 里面的字符构成。
如果可以构成,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
输入:ransomNote = "a", magazine = "b"
输出:false
输入:ransomNote = "aa", magazine = "ab"
输出:false
输入:ransomNote = "aa", magazine = "aab"
输出:true
因为是字符,所以可以采用数组的hash表(也可以使用unordered_map的hash表,因为考虑到效率而且还不需要排序)
注:使用数组还是使用set/map类型的hash表,要认真考虑,如果元素用数组可以很好的表示,那就使用数组.比如字符…
明日补充...
//时间复杂度 O(n) 空间复杂度O(n)
bool canConstruct(string s1, string s2) {
if(s1.size()>s2.size()) {
return false;
}
unordered_map<char,int> sMap;
for(char c : s2) {
if(sMap.find(c)==sMap.end()) {
sMap[c] = 1;
} else {
sMap[c]++;
}
}
for(char c : s1) {
if(sMap.find(c)!=sMap.end()) {
sMap[c]--;
if(sMap[c]<0){
return false;
}
}else{
return false;
}
}
return true;
}
bool canConstruct(string ransomNote, string magazine) {
if(ransomNote.size()>magazine.size()) {
return false;
}
sort(ransomNote.begin(),ransomNote.end());
sort(magazine.begin(),magazine.end());
//cout<
int i,j;
for(i = 0,j = 0; i < ransomNote.size(); i++,j++) {
if(j>=magazine.size()) {
return false;
}
if(ransomNote[i]==magazine[j]) {
continue;
} else if(ransomNote[i]>magazine[j]) {
i--;
} else {
return false;
}
}
return true;
}
明日补充...
给定两个数组,编写一个函数来计算它们的交集。
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result;//存放结果
unordered_set<int> numsSet(nums1.begin(),nums1.end());
for(int num : nums2) {
//如果发现 nums2的元素 ,在numsSet中出现过
if(numsSet.find(num)!=numsSet.end()) {
result.insert(num);
}
}
return vector<int>(result.begin(),result.end());
}
明日补充...
给定两个数组,编写一个函数来计算它们的交集。
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
因为不去重,不考虑顺序,而且考虑到了效率我们可以采用unordered_map类型的hash表
具体实现:
unordered_map numsMap
中,然后遍历nums中的每个元素num.vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
unordered_map<int,int> numsMap;
for(int i = 0; i < nums1.size(); i++) {
if(numsMap.find(nums1[i])==numsMap.end()) {
numsMap[nums1[i]]=1;
} else {
numsMap[nums1[i]]++;
}
}
for(int i = 0; i < nums2.size(); i++) {
if(numsMap.find(nums2[i])!=numsMap.end()) {
numsMap[nums2[i]]--;
res.push_back(nums2[i]);
if(numsMap[nums2[i]]==0) { //如果该元素在map中的值已经减为了0,则删除该元素.
numsMap.erase(nums2[i]);
}
}
}
return res;
}
此方法和上面的方法二思路一致,不再阐述…
//方法二:双指针 O(nlogn) 空间O(n)
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> nums3;
int i = 0,j = 0;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
while(i<nums1.size() && j<nums2.size()) {
if(nums1[i]==nums2[j]) {
nums3.push_back(nums1[i]);
i++,j++;
} else if(nums1[i]<nums2[j]) {
i++;
} else if(nums1[i]>nums2[j]) {
j++;
}
}
return nums3;
}
大家卷起来啊,加油!!!冲他姥姥的!