目录
387. 字符串中的第一个唯一字符LeetCode: 387. 字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符
LeetCode: 387. 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1
因为假定只含小写字母
方法1:哈希表
我们可以在第一次遍历字符串时,按字符的出现顺序存储字符,并计数。最后,再从头遍历一遍字符串,对每个字符在哈希表中的值进行判断。若计数为
1
,即为我们的目标。
解析
unordered_map<char,int> hashtable
创建一个名为hashtable 的 unordered_map (映射到 string )
hashtable.reserve(26)
reserve(n)
预分配n个元素的存储空间
hashtable[s[i]] == 1
哈希表中数值出现一次
#include <string>
#include <unordered_map>
using namespace std;
class Solution
{
public:
int firstUniqChar(string s)
{
unordered_map<char,int> hashtable;
hashtable.reserve(26);
for (const char ch : s)
{
hashtable[ch]++;
}
const int n = s.size();
for (int i = 0;i < n; i++)
{
if (hashtable[s[i]] == 1)
return i;
}
return -1;
}
};
383. 赎金信
LeetCode: 383. 赎金信
题目:
为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。
给你一个赎金信 (ransomNote) 字符串和一个杂志(magazine)字符串,判断 ransomNote 能不能由 magazines 里面的字符构成。
如果可以构成,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
分析
1.
题目中并没有说字符串
ransomNote
和magazine
两者之间的长短关系。如果ransomNote
的长度大于magazine
,那么按题意这是不能构成赎金信的,所以一开始要对两者的长度进行比较,如果是这样就直接返回假值。
2.
以
magazine
字符串为参照,在哈希表中记录每个字符的个数。之后遍历ransomNote
字符串时,每个字符的计数减1。最后遍历一遍哈希表,如果有负值,就代表ransomNote
中有magazine
无法覆盖的字符。
3.
int *cnts = new int[26]{}
对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加() /*此处摘抄于大佬*/
new(多个对象)数组
new分配的对象,不管单个对象还是多个对象的分配,都是默认初始化。 但可以对数组进行值初始化,方法就是:在大小之后添加一对空括号。
1
2
int *pia = new int [ 10 ]; // 10个未初始化int
int *pia2 = new int [ 10 ](); // 10个值初始化为0的int
————————————————
版权声明:本文为CSDN博主「zwz2011303359」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zwz2011303359/article/details/80871050
#include <string>
using namespace std;
class Solution
{
public:
bool canConstruct(string ransomNote, string magazine)
{
const int len1 = ransomNote.length(), len2 = magazine.length();
if (len1 > len2)
return false;
int *cnts = new int[26]{};
for (int i = 0; i < len2; i++)
{
cnts[magazine[i] - 'a']++;
}
for (int i = 0; i < len1; i++)
{
cnts[ransomNote[i] - 'a']--;
}
for (int i = 0; i < 26; i++)
{
if (cnts[i] < 0)
return false;
}
return true;
}
};
242. 有效的字母异位词
题目:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
方法1:哈希表
题目中说到两个字符串中每个字符出现的次数相同则为真值,我们也可以使用上题[350. 两个数组的交集 II]的方式去完成。先将字符串
s
中的字符个数计入哈希表中,然后遍历字符串t
,将每个字符的计数减1,如果减完的结果为负数,就说明两个字符串不符合题目要求。
class Solution {
public:
bool isAnagram(string s, string t) {
const int n = s.length();
if (n != t.length())
return false;
int *cnts = new int[26]{};
for (int i = 0; i < n ;i++)
{
cnts[s[i] - 'a']++;
}
for (int j = 0;j < t.length();j++)
{
if (cnts[t[j] - 'a'] == 0)
return false;
cnts[t[j] - 'a'] --;
}
return true;
}
};