242、有效的字母异位词
题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
思路一
s和t是异位词 <==> s和t排序后相等
因此,先把s和t排序,之后比较即可
代码:
class Solution {
public:
bool isAnagram(string s, string t) {
//排序
sort(s.begin(), s.end());
sort(t.begin(), t.end());
//比较并返回结果
return s == t;
}
};
时间复杂度:O(nlogn);排序的时间复杂度为O(nlogn)、比较字符串是否相等的时间复杂度为O(n),总体的时间复杂度为O(nlogn)。
空间复杂度:O(logn);排序需要O(logn)的空间复杂度。
思路二
使用哈希表,记录s中每个字母出现的频次。
然后遍历t,不断地减去已经记录好的频次。
最后遍历哈希表,如果其中有不为0的元素,则表示s和t不是异位词。
代码:
class Solution {
public:
bool isAnagram(string s, string t) {
int array[26] = {0};//定义一个数组记录字符串中字母出现的频次
//遍历字符串s
for (int i = 0; i < s.size(); i++) {
array[s[i]-'a']++;//记录相应字母的出现频次
}
//遍历字符串t
for (int i = 0; i < t.size(); i++) {
array[t[i]-'a']--;
}
//遍历数组,判断数组中元素是否全是0
for (int i = 0; i < 26; i++) {
if (array[i] != 0) {
return false;
}
}
return true;
}
};
时间复杂度:O(n);遍历哈希表需要的时间复杂度为O(n);
空间复杂度:O(1);空间固定需要长度为26的数组。
两个思路的优化
如果s的长度和t的长度不相等,那么这两个字符串一定不是异位词。
针对这样的特殊情况,先进行长度判断可以有效提高效率。
代码:
if (s.length() != t.length()) {
return false;}
349、两个数组的交集
题目描述
给定两个数组 nums1 和 nums2 ,返回 它们的交集。
输出结果中的每个元素一定是唯一 的。我们可以不考虑输出结果的顺序 。
思路
分析题意:结果中每个元素是唯一的、无序的。
可以用哈希表来存储结果,注意本题的结果数量是不固定的,因此不能用固定空间都数组做哈希表;
这里选择用unordered_set
来存储结果。
暴力法
代码:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
int n1 = nums1.size(), n2 = nums2.size();
for (int i = 0; i < n1; i++) {//遍历nums1
for (int j = 0; j < n2; j++) {//对于每个nums1的元素,遍历nums2
//如果找到两数组中元素相等且该元素不在结果集中时,把该元素加入结果集
if (nums1[i] == nums2[j] && find(res.begin(), res.end(), nums1[i]) == res.end()) {
res.push_back(nums1[i]);
}
}
}
return res;
}
};
时间复杂度:O(mn);m表示nums1的长度,n表示nums2的长度。
空间复杂度:O(n);存储结果的容器最多存储两个数组中最短长度数组的元素。
哈希表法
本解法中用
unordered_set
来给结果去重,达成结果元素唯一性的题目要求。
代码:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> res;//用来存放结果,同时可以给结果去重
unordered_set<int> nums_set(nums1.begin(),nums1.end());//把nums1转换成set,方便对元素的查找
//遍历nums2中的所有元素
for (int num : nums2) {
//从nums_set中搜索num,若找到,则说明num是nums1和nums2的交集
if (nums_set.find(num) != nums_set.end()) {
res.insert(num);//将num存入res中
}
}
return vector<int>(res.begin(),res.end());//把结果集转换成vector并返回
}
};
时间复杂度:O(n+m);n为遍历nums2,m为把结果集转换成vector。
空间复杂度:O(n);