- 为了检查 t 是否是 s的重新排列,我们可以计算两个字符串中每个字母的出现次数并进行比较。因为 S 和 T 都只包含 A-Z 的字母,所以一个简单的 26 位计数器表就足够了。
- 我们需要两个计数器数表进行比较吗?实际上不是,因为我们可以用一个计数器表计算 s 字母的频率,用 t 减少计数器表中的每个字母的计数器,然后检查计数器是否回到零。
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length()!=t.length())
{
return false;
}
int map[26] = {0};
for(int i=0; i<s.length();i++)
{
map[s[i]-'a']++;
map[t[i]-'a']--;
}
for(int i=0; i<26;i++)
{
if(map[i]!=0)
{
return false;
}
}
return true;
}
};
- 两遍哈希表:空间O(n)时间O(n)
- 第一次遍历原数组,构建哈希表(以值为键,以索引为值)
- 第二次遍历原数组,在哈希表中查找键
target - nums[i]
,如果存在则返回两个索引 - 注意判断两个索引不相等(如果原数组有重复元素时这个方法就不好整)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> num_map;
vector<int> res;
map<int,int>::iterator it;
for(int i=0;i<nums.size();i++)
{
num_map[nums[i]] = i;
}
for(int i =0;i<nums.size();i++)
{
it = num_map.find(target-nums[i]);
if(it!=num_map.end()&&it->second!=i)
{
res = {i,it->second};
return res;
}
}
return res;
}
};