leetcode_有效的字母异位词
一、题目

二、参考代码
使用两个遍历和一个数组,数组大小为26,用来记录字母出现的次数,这样的想法很好,我当时想的时候,以为所有小写字母数字为24,所以导致内存访问错误。
参考代码如下:
class Solution { public: bool isAnagram(string s, string t) { int record[26] = {0}; for (int i = 0; i < s.size(); i++) { // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了 record[s[i] - 'a']++; } for (int i = 0; i < t.size(); i++) { record[t[i] - 'a']--; } for (int i = 0; i < 26; i++) { if (record[i] != 0) { // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。 return false; } } // record数组所有元素都为零0,说明字符串s和t是字母异位词 return true; } };
三、我的思路
我本来以为是要使用set或者是map,后来发现vector完全可以满足要求,这样看来我的想法还是太过复杂,但是功能基本都已经实现了。但是因为是使用24个大小的字符,所以导致
访问出错。而且查找的时候也不用使用set,因为他们可以做映射,所以直接使用vector就好了,也不用两个vector。
class Solution { public: bool isAnagram(string s, string t) { unordered_set<char> dict; int length_s = s.size(); int t_length = t.size(); //std::cout<<'very good!'<<std::endl; if(t_length != length_s){ return false; } vector<int> s_num(26, 0); vector<int> t_num(26,0); //std::cout<<'good!'<<std::endl; for(int i=0; i<length_s; i++){ if(dict.find(s[i]) == dict.end()){ //不在里面,则读入 dict.insert(s[i]); } s_num[s[i]-'a'] ++; } //for(int i=0; i<24;i++) // std::cout<<s_num[i]<<std::endl; for(int i=0; i<t_length; i++){ if(dict.find(t[i]) == dict.end()) return false; else t_num[t[i] - 'a'] ++; } //如果两个数组相等 int flag = 0; for(int i=0; i<24; i++){ if(s_num[i] == t_num[i]){ flag++; } else return false; } if (flag==24) return true; return false; } };
纵一苇之所如,临万顷之茫然。

浙公网安备 33010602011771号