问题
给定两个字符串和,编写一个函数来判断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
方法一:哈希表
package leetcode;
public class leetcode_242 {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()){
return false;
}
int[] table = new int[26];
for(int i = 0; i <= s.length(); i++){
//charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1
table[s.charAt(i) - 'a'] ++;
}
for(int i = 0; i <= t.length(); i++){
table[t.charAt(i) - 'a'] --;
if(table[t.charAt(i) - 'a'] < 0){
return false;
}
}
return true;
}
}
- 时间复杂度:
,其中 n 为 s 的长度
- 空间复杂度:
,其中 S 为字符集大小,此处 S=26
方法二:排序
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);
}
}
- 时间复杂度:
,其中 n 为 s 的长度。排序的时间复杂度为
,比较两个字符串是否相等时间复杂度为
,因此总体时间复杂度为
- 空间复杂度: