思路1:哈希表
借鉴了做过的题目LeetCode 387. 字符串中的第一个唯一字符,建立26个字母的数组character[26]。
代码:
class Solution {
public:
bool isAnagram(string s, string t)
{
if(s.length() != t.length())
return 0;
int character_s[26]={0};
int character_t[26]={0};
for(int i = 0; i < s.length(); ++i)
character_s[(s[i]-97)] += 1;
for(int i = 0; i < t.length(); ++i)
character_t[(t[i]-97)] += 1;
for(int i = 0; i < 26; ++i)
{
if( character_t[i] != character_s[i] )
return 0;
}
return 1;
}
};
用了三个for循环,后来看到官方解答只用了两个,把第三个用于检查的for循环放到了第二个for循环中,具体方法是:只维护一个character数组,第一次加,第二次减,而由于长度一致,所以如果不一样,必有数组中的值<0。
优化后的代码:
class Solution {
public:
bool isAnagram(string s, string t)
{
if(s.length() != t.length())
return 0;
int character[26]={0};
for(int i = 0; i < s.length(); ++i)
character[(s[i]-97)]++;
for(int i = 0; i < t.length(); ++i)
{
character[(t[i]-97)]--;
if( character[(t[i]-97)] < 0 )
return 0;
}
return 1;
}
};
思路2:排序
由于有现成的函数sort,故比较s和t排序后是否一致即可。
class Solution {
public:
bool isAnagram(string s, string t)
{
if(s.length() != t.length())
return 0;
sort(s.begin(),s.end());
sort(t.begin(),t.end());
return s==t;
}
};