学习目标:
leetcode刷题
学习内容:
字符串的第一个唯一字符
link:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn5z8r/
(1)两个数组
(2)两次遍历和哈希表
(3)队列
有效的字母异位词
link:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn5z8r/
(1)先排序
(2)unordered_map
学习时间:
2021.4.27 中午
学习产出:
字符串的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
第一种思路:创建两个数组来模拟哈希表
class Solution {
public:
int firstUniqChar(string s) {
int a[26]={0};
int index[26];
int n=s.size();
for(int i=0;i<n;i++)
{
a[s[i]-'a']++;
index[s[i]-'a']=i;
}
for(int i=0;i<n;i++)
{
if(a[s[i]-'a']==1)
{
return index[s[i]-'a'];
}
}
return -1;
}
第二种思路:利用两次遍历和哈希表来反映次数 输出第一个带有重复的元素就ok(官方答案)
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<int, int> frequency;
for (char ch: s) {
++frequency[ch];
}
for (int i = 0; i < s.size(); ++i) {
if (frequency[s[i]] == 1) {
return i;
}
}
return -1;
}
};
第三种思路:利用队列(先进先出)(官方答案)
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<char, int> position;
queue<pair<char, int>> q;
int n = s.size();
for (int i = 0; i < n; ++i) {
if (!position.count(s[i])) {
position[s[i]] = i;
q.emplace(s[i], i);
}
else {
position[s[i]] = -1;
while (!q.empty() && position[q.front().first] == -1) {
q.pop();
}
}
}
return q.empty() ? -1 : q.front().second;
}
};
有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
第一种思路:先排序再比较(比较慢)
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size()) //如果不等,直接返回false
return false;
sort(s.begin(),s.end());
sort(t.begin(),t.end());
for(int i=0;i<s.size();i++) //挨个比较是不是一样
{
if(s[i]!=t[i]) //一个不一样直接返回false
return false;
}
return true;
}
};
第二种思路:利用unordered_map来查找(低时间)
class Solution {
public:
bool isAnagram(string s, string t) {
int n=s.size();
if(s.size()!=t.size())
return false;
unordered_map<int,int>m;
for(int i=0;i<n;i++)
{
++m[s[i]];
--m[t[i]];
}
for(int i='a';i<='z';i++)
{
if(m.find(i)!=m.end()&&m[i]) return false;
}
return true;
}
};