题目描述:
给定两个字符串
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
仅包含小写字母
法一:通过题目描述和示例可以得出,如果字符串t是字符串s的字母异位词,那么s和t在按照字母表升序排序后应该是相等的。所以我们可以分别对这两个字符串排序,再对排完序后的两字符串进行比较就能达到题目的要求。
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) { //如果两字符串的长度不相等,则一定不是彼此的异位词
return false;
}
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
return Arrays.equals(str1, str2);
}
}
法二:考虑到如果t是s的异位词,那么 t 和 s 中出现的字符种类和次数是相同的,所以我们可以维护一个长度为26的数组counts,用于保存字符串中各个字符出现的次数。为了节省空间,可以在遍历字符串 s 的时候填充完整该数组,那么在遍历完成时该数组就保存了字符串 s 中出现的字符以及所出现字符的个数。接着就可以在遍历字符串 t 的时候对照该数组 counts 进行相应位置的递减操作,即拿着该数组去遍历字符串 t , 每遍历 t 中的一个字符,就去数组counts中找对应的元素值并做递减操作。这样一来,如果 t 是 s 的字母异位词, 那么在 t 遍历结束时counts中的所有元素值都应为零,否则 t 不是 s 的字母异位词。
class Solution{
public boolean isAnagram(String s, String t){
int[] counts = new int[26]; //声明和初始化一同进行(动态初始化)
for(char c : s.toCharArray()){
counts[c - 'a']++;
}
for(char c : t.toCharArray()){
counts[c - 'a']--;
}
for(int i : counts){
if(i != 0)
return false;
}
return true;
}
}
在上述遍历字符串 s 和 t 的过程中,我们是先把字符串转换为了字符数组,再用增强for循环完成的遍历,当然也可以直接对字符串的构成字符进行遍历,这就要用到charAt() 函数了。在Java中String类有一个返回某个索引处的字符的函数: char charAt(int index)
所以上述遍历字符串的部分也可以写成:
for(int i = 0; i < s.length(); i++){
counts[s.charAt(i) - 'a']++;
}