1.
关键点的思想: 哈希映射思想,
- 使用了数组的下标代表了 对应的字符,
- 使用下标位置中的保存数值, 代表了该字符出现的次数了;
具体讲来:
根据字母与 字母a 算差值, 将该差值映射到数组的下标位置上, 并将该位置上的数值加一, 代表该字母出现一次了;
实现步骤:
-
如果两个字符串长度不等, 直接返回 false;
-
将每个字符减去字符 “a”, 他们相减时,便是对应到0~25 这二十六个字母;
-
使用一个大小为 26 的数组record, 初始值默认为0,
-
先遍历一个字符串,每个字符减去字符 “a”, 每一次相减时得到 diff ,对应到 record中下标为diff 的位置上,数值加一, 从而代表该字符出现一次;
-
然后,遍历另一字符串, 每个字符减去字符 “a”, 每一次相减时得到 diff ,对应到 record中下标为diff 的位置上,数值 减一, 从而代表了该字符在该串中出现了,
每次减一之后, 判断该位置上的数值 是否 小于 零,
小于零, 代表该字符在 前一个串中,没有出现过,返回false;
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length() ){
return false;
}
int record[26] = {0};// 数组的初始化
for(int i = 0; i < s.length(); i++){
int diff = s[i] - 'a' ;
record[diff]++;
printf("%d", record[diff]);
}
for(int i = 0; i< t.length(); i++){
int diff = t[i] - 'a';
record[diff]--;
printf("%d", record[diff]);
if (record[diff] < 0){return false;}
}
return true;
}
};
2. 链表中相交集合
2.1 unordered_set 集合中各种方法
c++中 使用unordered_set , 定义集合,
unordered_set<int> nums_set;
- 当两个集合中的元素类型相同时, 可以使用
nums_set.insert(num1_set.begin(), num1_set.end() )
将num1_set 中的元素,全部添加到 nums_set 集合中;
在元素的输出上, 可以使用遍历器(又称迭代器)进行输出控制。
vector<int> b(a.begin(), a.begin()+3)
:
这种声明形式中, (a.begin()、a.begin()+3) 表示向量起始元素位置到起始元素+3之间的元素位置。
(a.begin(), a.end())
:
则表示, 包含起始元素到最后一个元素 的所有元素。
向量元素的位置便成为遍历器, 同时, 向量元素的位置也是一种数据类型, 在向量中遍历器的类型为:
vector<int>::iterator
。
遍历器不但表示元素位置, 还可以再容器中前后移动。
在上例中讲元素全部输出部分的代码就可以改写为:
//全部输出
vector<int>::iterator t ;
for(t=a.begin(); t!=a.end(); t++)
cout<<*t<<" " ;
*t 为指针的间接访问形式, 意思是访问t所指向的元素值。
set1.find(a)
判读集合中是否有a 元素,
若果有,返回该元素;
如果没有则返回 set1.end()
2.2 解题步骤
- 利用 unordered_set 集合自身的属性, 是无顺序且没有重复元素的特点,
调用vector 自身的 begin, end 方法, 将nums1数组中的元素 存入到集合1中;
-
遍历数组nums2, 将其中的与集合1中重复的元素存入到, result 集合中;
使用集合中的 find 方法 查找是否存在元素, 存在就将元素插入到result 集合中 ; -
返回result 集合中的所有元素;
#include "vector"
#include "unordered_set"
using namespace std;
class Solution{
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2){
// unorder_set 是一个容器, 其中的元素是无顺序, 无重复;
// 新建一个 result 集合;
unordered_set<int> result;
// 将数组1 中的元素, 存放到新建集合中去;
unordered_set<int> nums1_set(nums1.begin(), nums1.end());
// 遍历数组2 中的元素, 将与 集合1中 重复的元素,存入到 result 集合中;
// 判断集合1中有无 数组2中的元素, 使用的是集合的. find 方法 与 集合.end() 搭配使用;
for(int i = 0; i < nums2.size(); i++){
if(nums1_set.find(nums2[i]) != nums1_set.end() ) {
// 如果find() 返回的不是 .end(), 表明查找到,该元素;且返回的也是该元素;
result.insert(nums2[i]);
}
}
// 重新将集合转化为数组;
return vector<int> (result.begin(), result.end());
}
};