Leetcode 242 有效的字母异位词(哈希表)
解法1. 转为字符串数组-排序-比较
采用排序的方法,先把字符串转化为字符数组,之后进行字符数组排序,之后比较两个字符数组是否相同
字符串长度:s.length()
字符串转为字符串数组:char a[] = s.toCharArray()
排序字符串数组(升序):Arrays.sort(a)
比较两个字符串数组是否一样:Arrays.euqals(a, b)
时间复杂度:O(nlogn),其中 n 为 s 的长度。排序的时间复杂度为O(nlogn),比较两个字符串是否相等时间复杂度为 O(n),因此总体时间复杂度为 O(nlogn+n)=O(nlogn)。
空间复杂度:O(logn)。排序需要 O(logn) 的空间复杂度。注意,在 Java 中字符串是不可变的,因此我们需要额外的 O(n) 的空间来拷贝字符串。但是我们忽略这一复杂度分析,因为:
这依赖于语言的细节;
这取决于函数的设计方式,例如,可以将函数参数类型更改为 char[]
class Solution {
public boolean isAnagram(String s, String t) {
// 采用排序的方法,先把字符串转化为字符数组,之后进行字符数组排序,之后比较两个字符数组是否相同
// 如果两个字符串长度不同,则直接返回false
if(s.length() != t.length()) return false;
// 把字符串转化为字符数组
char a[] = s.toCharArray();
char b[] = t.toCharArray();
// 排序字符数组
Arrays.sort(a);
Arrays.sort(b);
// 比较两个字符数组是否相同
return Arrays.equals(a,b);
}
}
解法2
对于数组来说,使用 length 属性;
对于字符串来说,使用 length() 方法。
字符串长度:s.length()
数组的长度:arr.length
取出字符串中的字符:s.charAt(index)
定义一个数组作为hashmap保存26个小写字母,
遍历字符串s,取出每一个字符来,然后再对应数组的位置上++
遍历字符串t,取出每一个字符来,然后再对应数组的位置上–
遍历数组letter,如果里面不都为0,那么返回false,全为0则返回true
时间复杂度O(N)
空间复杂度O(N)
class Solution {
public boolean isAnagram(String s, String t) {
// 定义一个数组作为hashmap保存26个小写字母
int[] letter = new int[26];
// 遍历字符串s,取出每一个字符来,然后再对应数组的位置上++
for(int i = 0; i < s.length(); i++){
letter[s.charAt(i) - 'a']++;
}
// 遍历字符串t,取出每一个字符来,然后再对应数组的位置上--
for(int i = 0; i < t.length(); i++){
letter[t.charAt(i) - 'a']--;
}
// 遍历数组letter,如果里面不都为0,那么返回false,全为0则返回true
for(int i = 0; i < letter.length; i++){
if(letter[i] != 0) return false;
}
return true;
}
}