问题

给定两个字符串和,编写一个函数来判断t是否是s的字母异位词

示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true

示例 2:
输入: s = “rat”, t = “car”
输出: false

说明:你可以假设字符串只包含小写字母

思路

数组其实就是一个简单哈希表,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。
首先定义一个大小为26的数组,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值
定义一个数组record用来记录字符s里字符出现的次数:

  • 需要把字符映射到数组也就是哈希表的索引下表上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25
  • 遍历字符串s的时候,只需要将 s[i] - ‘a’ 所在的元素做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了。这样就将字符串s中字符出现的次数,统计出来了

如何检查字符串t中是否出现了这些字符:

  • 遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作

最后,record数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false
最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true

方法一:哈希表

  1. package leetcode;
  2. public class leetcode_242 {
  3. public boolean isAnagram(String s, String t) {
  4. if(s.length() != t.length()){
  5. return false;
  6. }
  7. int[] table = new int[26];
  8. for(int i = 0; i <= s.length(); i++){
  9. //charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1
  10. table[s.charAt(i) - 'a'] ++;
  11. }
  12. for(int i = 0; i <= t.length(); i++){
  13. table[t.charAt(i) - 'a'] --;
  14. if(table[t.charAt(i) - 'a'] < 0){
  15. return false;
  16. }
  17. }
  18. return true;
  19. }
  20. }
  • 时间复杂度:leetcode-242:有效的字母异位词 - 图1,其中 n 为 s 的长度
  • 空间复杂度:leetcode-242:有效的字母异位词 - 图2,其中 S 为字符集大小,此处 S=26

方法二:排序

  1. class Solution {
  2. public boolean isAnagram(String s, String t) {
  3. if (s.length() != t.length()) {
  4. return false;
  5. }
  6. char[] str1 = s.toCharArray();
  7. char[] str2 = t.toCharArray();
  8. Arrays.sort(str1);
  9. Arrays.sort(str2);
  10. return Arrays.equals(str1, str2);
  11. }
  12. }
  • 时间复杂度:leetcode-242:有效的字母异位词 - 图3,其中 n 为 s 的长度。排序的时间复杂度为 leetcode-242:有效的字母异位词 - 图4,比较两个字符串是否相等时间复杂度为 leetcode-242:有效的字母异位词 - 图5,因此总体时间复杂度为 leetcode-242:有效的字母异位词 - 图6
  • 空间复杂度:leetcode-242:有效的字母异位词 - 图7