387. 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = “leetcode”
返回 0
s = “loveleetcode”
返回 2
class Solution {
public:
int firstUniqChar(string s) {
vector<int> flag(s.size(),0);
for(int i=0;i<s.size();i++)
{
if(flag[i]==0)
{
for(int j=s.size()-1;j>i;j--)
{
if(s[i]==s[j])
{
flag[i]=flag[j]=1;
break;
}
}
}
if(flag[i]==0)
return i;
}
return -1;
}
};
个人总结: 还是老问题,能写是能写,速度内存都不太行。仍需努力
383. 赎金信
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)
示例 1:
输入:ransomNote = “a”, magazine = “b”
输出:false
示例 2:
输入:ransomNote = “aa”, magazine = “ab”
输出:false
示例 3:
输入:ransomNote = “aa”, magazine = “aab”
输出:true
哈希表
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char,int> a;
for(char x:magazine)
{
a[x]++;
}
for(char x:ransomNote)
{
if(a.find(x)!=a.end()&&a[x]>0)
a[x]--;
else
return false;
}
return true;
}
};
数组
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
vector<int> a(26,0);
for(char x:magazine)
{
a[x-'a']++;
}
for(char x:ransomNote)
{
if(a[x-'a']>0)
a[x-'a']--;
else
return false;
}
return true;
}
};
个人总结: 这次两种方法提交都是一次成功,说明细节上的失误更少了。数组方法速度快很多。
242. 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
数组
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> a(26,0);
for(char x:s)
{
a[x-'a']++;
}
for(char x:t)
{
if(a[x-'a']>0)
a[x-'a']--;
else
return false;
}
for(int x:a)
{
if(x!=0)
return false;
}
return true;
}
};
个人总结: 数组方法速度快,但是我看到题解里的排序后比较的方法,觉得那个简洁多了,但运行效率较差,想来世间安得两全法。