LeetCode 242 有效的字母异位词
题目:
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
思路:
首先需要理解字母异位词的含义,简单理解为:两字符串的长度相同,字母相同,但顺序不同。
字母异位词简意为两字符串长度相同,字母相同,顺序不同。如果是异位词那么输出true,否则就输出false。
首先我的想法是:第一步判断两个字符串的长度是否相等,其次,分别统计每一个字母出现的次数,在进行比较。如果都一样,那么输出true,否则false。
既然提示说,只会出现小写字母,那我们不妨用一个大小为27的数组来统计对应的字母出现的次数,已知小写英文字母的ASCII范围为97-122,那么分别对应1-26的下标数组。
初始化这个数组全为0,当第一个统计第一个字符串的时候,我们采用自增,统计第二个字符串的时候,我们采用自减。是异位词的话,那么说明它最后会回到初始状态,如果出现其他情况,比如-1,或者加和不为0,那么false。
上代码!
class Solution {
public:
bool isAnagram(string s, string t) {
int nums = s.size();
int numt = t.size();
if (nums != numt) {
return false;
}
int a[27] = { 0 };
for (int i = 0; i < nums; i++) {
a[s[i] - 97]++;
}
for (int i = 0; i < numt; i++) {
a[t[i] - 97]--;
}
int sum = 0;
for (int i = 0; i < 27; i++) {
sum += a[i];
if (a[i] < 0) {
return false;
}
else if (sum != 0) {
return false;
}
}
return true;
}
};
这代码,够垃圾,也够直接!
LeetCode 349 两个数组的交集
题目:
给定两个数组 nums1
和 nums2
,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
思路:
首先,题目要求我们交到两个数组的交集部分,并且返回交集的元素只能是唯一的,就是不重复的意思。
那么我们第一步应该先把两个数组中相同的部分找出来,然后再进行一次遍历,删除相同元素就可以返回结果了。
具体怎么做呢?
用数组a记录数组nums1中每个元素出现的次数,再统计数组nums2每一项出现的次数,做好标记,输出交集即可。
上代码!
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size();
int len2 = nums2.size();
int a[10] = { 0 };
int b[10] = { 0 };
for (int i = 0; i < len1; i++) {
a[nums1[i]]++;
}
for (int i = 0; i < len2; i++) {
if (a[nums2[i]] != 0) {
b[nums2[i]] = 1;
}
}
vector<int> ss;
for (int i = 0; i < 10; i++) {
if (b[i] != 0) {
ss.push_back(i);//由于是容器的返回,用push_back传值
}
}
return ss;
}
};
你以为这就完了吗,LeetCode真恶心,你告诉我这是个什么东西。
改呗,还能怎么办!
好好好,加到1000还不够,是我保守了。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size();
int len2 = nums2.size();
int a[9999] = { 0 };
int b[9999] = { 0 };
for (int i = 0; i < len1; i++) {
a[nums1[i]]++;
}
for (int i = 0; i < len2; i++) {
if (a[nums2[i]] != 0) {
b[nums2[i]] = 1;
}
}
vector<int> ss;
for (int i = 0; i < 9999; i++) {
if (b[i] != 0) {
ss.push_back(i);//由于是容器的返回,用push_back传值
}
}
return ss;
}
};