- 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
通过次数176,478提交次数280,045
分析:此题较为简单,题目就是要求判断每个单词中包含的字母及其出现的次数是否相同即可。
方法一:可以对数组进行排序,然后逐个对比两个数组中的字符即可,这个时间复杂度位O(nlogn),即为Arrays.sort()排序所耗费的时间。
代码如下:
class Solution {
public boolean isAnagram(String s, String t) {
char[] s1 = s.toCharArray();
char[] s2 = t.toCharArray();
Arrays.sort(s1);
Arrays.sort(s2);
int n1 = s1.length;
int n2 = s2.length;
if(n1 != n2){
return false;
}
for(int i = 0;i < n2;i++){
if(s1[i] != s2[i]){
return false;
}
}
return true;
}
}
方法二:可以使用时间复杂度更低的方法,使用哈希表存储每个字符及其出现的次数。开创一个26容量数组存储s中每个字符出现次数,然后再依次用t中的字符进行相减,如果最后数组中的值有为非0的数,那么就说明不符合题意。
代码如下
class Solution {
public boolean isAnagram(String s, String t) {
int ls = s.length();
int lt = t.length();
if(ls != lt){
return false;
}
//只有小写字母 开一个 26容量的数组 存储s每个字母出现的次数
//然后再遍历t中的每个字母,出现一次将相应的频次减一即可
//如果最后哈希表中有不等于0的次数 说明t中出现了s中不存在的字母 或者字母数量不等
int[] hashtable = new int[26];
for(int i = 0;i < ls;i++){
hashtable[s.charAt(i) - 'a']++;
}
for(int i = 0;i < lt;i++){
hashtable[t.charAt(i) - 'a']--;
}
for(int i = 0;i < hashtable.length;i++){
if(hashtable[i] != 0){
return false;
}
}
return true;
}
}