day6-字符串
1、字符串中的第一个唯一字符
-
描述
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。 示例 1: 输入: s = "leetcode" 输出: 0 示例 2: 输入: s = "loveleetcode" 输出: 2 示例 3: 输入: s = "aabb" 输出: -1
-
思路
获取每个字母的个数,再遍历数组获取索引
-
代码
#include <iostream> #include <string> using namespace std; #include <map> class Solution { public: int firstUniqChar(string s) { map<char,int> letter; for(int i = 0; i < s.size(); i++) { letter[s[i]]++; } for(int i = 0; i < s.size(); i++) { if(letter[s[i]] == 1) return i; } return -1; } }; int main() { string str = "aabb"; Solution sol; int tmp = sol.firstUniqChar(str); printf("%d \n",tmp); return 0; }
2、赎金信
-
描述
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1: 输入:ransomNote = "a", magazine = "b" 输出:false 示例 2: 输入:ransomNote = "aa", magazine = "ab" 输出:false 示例 3: 输入:ransomNote = "aa", magazine = "aab" 输出:true 提示: 1 <= ransomNote.length, magazine.length <= 105 ransomNote 和 magazine 由小写英文字母组成
-
思路
获取magazine字符的个数,读取ransomNote的字符每个-1。
-
代码
#include <iostream> using namespace std; #include <string> #include <map> class Solution { public: bool canConstruct(string ransomNote, string magazine) { map<char,int> letter; if(magazine.size() < ransomNote.size()) return false; for(int i = 0; i < magazine.size(); i++) { letter[magazine[i]]++; } for(int i = 0; i < ransomNote.size(); i++) { if(letter[ransomNote[i]] == 0) return false; else letter[ransomNote[i]]--; } return true; } }; int main() { Solution sol; string magazine = "aab"; string ransomNote = "aa"; cout << sol.canConstruct(ransomNote,magazine); return 0; }
3、有效的字母异位词
-
描述
给定两个字符串 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 仅包含小写字母
-
思路
将两个字符串的字符和个数分别放入两个map,并比较map是否相等
-
代码
#include <iostream> using namespace std; #include <string> #include <map> class Solution { public: bool isAnagram(string s, string t) { if(s.size() != t.size()) return false; map<char,int> a; map<char,int> b; for(int i = 0; i < s.size(); i++) { a[s[i]]++; b[t[i]]++; } auto iter = a.begin(); cout << (a == b) << endl; while(iter != a.end()) { printf("%d %c %d\n",iter -> second,iter -> first , b[iter->first]); if(iter -> second != b[iter -> first]) return false; iter++; } return (a == b); } }; int main() { Solution sol; string s = "rat"; string t = "car"; cout << sol.isAnagram(s,t); return 0; }