Leetcode——242:有效字母的异位词
题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 输入: s = "anagram", t = "nagaram" 输出: true
解题思路
先看一下代码输出结果
String str = "abcdefghijklmnopqrstuvwxyz"; HashMap<Character, Integer> map = new HashMap<>(); for (int i = 0; i < str.length(); i++) { map.put(str.charAt(i), str.charAt(i) + 0); } for (Map.Entry<Character, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + " -- " + entry.getValue()); } a -- 97 b -- 98 c -- 99 d -- 100 e -- 101 f -- 102 g -- 103 h -- 104 i -- 105 j -- 106 k -- 107 l -- 108 m -- 109 n -- 110 o -- 111 p -- 112 q -- 113 r -- 114 s -- 115 t -- 116 u -- 117 v -- 118 w -- 119 x -- 120 y -- 121 z -- 122
可以看出,小写字母a~z转成int类型后是有序的,且任意小写字母int值范围在97~122之间,换言之 任意小写字母-去'a' 后得到的值在 0~25 之间,那么本题也是借用此规则来声明一个长度为26的int数组,遍历 s 和 t 为数组赋值,赋值索引为 s/t。charAt(i),遍历 s 时赋值自增1,遍历 t 时,赋值自减 1 ,最后在遍历一下两遍赋值后的数组,如果数组所有元素为0那么说明输入的两个单词是异位词,否则反之。
参考实现
public static boolean isAnagram(String s, String t) { int[] arr = new int[26]; for (int i = 0; i < s.length(); i++) { //[s.charAt(i) - 'a'] 字符串全是小写字母, //所有小写字符减去 ‘a’ 得到的值最大是 25, //也就是说需要在这些索引上的valeu 做文章 arr[s.charAt(i) - 'a']++; } for (int i = 0; i < t.length(); i++) { arr[t.charAt(i) - 'a']--; } for (int i : arr) { if (i != 0) { return false; } } return true; }