242. 有效的字母异位词(easy)

  • 为了检查 t 是否是 s的重新排列,我们可以计算两个字符串中每个字母的出现次数并进行比较。因为 S 和 T 都只包含 A-Z 的字母,所以一个简单的 26 位计数器表就足够了。
  • 我们需要两个计数器数表进行比较吗?实际上不是,因为我们可以用一个计数器表计算 s 字母的频率,用 t 减少计数器表中的每个字母的计数器,然后检查计数器是否回到零。
  1. class Solution {
  2. public:
  3. bool isAnagram(string s, string t) {
  4. if(s.length()!=t.length())
  5. {
  6. return false;
  7. }
  8. int map[26] = {0};
  9. for(int i=0; i<s.length();i++)
  10. {
  11. map[s[i]-'a']++;
  12. map[t[i]-'a']--;
  13. }
  14. for(int i=0; i<26;i++)
  15. {
  16. if(map[i]!=0)
  17. {
  18. return false;
  19. }
  20. }
  21. return true;
  22. }
  23. };

1. 两数之和(easy)

  • 两遍哈希表:空间O(n)时间O(n)
    • 第一次遍历原数组,构建哈希表(以值为键,以索引为值)
    • 第二次遍历原数组,在哈希表中查找键 target - nums[i] ,如果存在则返回两个索引
    • 注意判断两个索引不相等(如果原数组有重复元素时这个方法就不好整)
  1. class Solution {
  2. public:
  3. vector<int> twoSum(vector<int>& nums, int target) {
  4. map<int,int> num_map;
  5. vector<int> res;
  6. map<int,int>::iterator it;
  7. for(int i=0;i<nums.size();i++)
  8. {
  9. num_map[nums[i]] = i;
  10. }
  11. for(int i =0;i<nums.size();i++)
  12. {
  13. it = num_map.find(target-nums[i]);
  14. if(it!=num_map.end()&&it->second!=i)
  15. {
  16. res = {i,it->second};
  17. return res;
  18. }
  19. }
  20. return res;
  21. }
  22. };