学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili
第一反应是先用2个数组分别储存字符串s、t,然后用双指针遍历两个数组,遇到相同的字母就抵消,最后看是否有数组中有字母剩下,有的话就不是有效字母异位词;没有字母剩下的话就是有效字母异位词
缺点:时间复杂率很高,O(n^2)
看了卡哥的题解,就差一点点就是卡哥的答案。。。。我的想法在于没有深入贯彻数组其实就是一个简单哈希表这个观念,所以没有把字母出现的次数用数组记录下来
数组的大小为多少呢?由于字符串都由小写字母组成,小写字母对应26个ASCII码所以最多出现26种小写字母,因此将数组大小设为26
int record[] = new int[26];
遍历字符串s,记录下字符串中字母对应的的ASCII码出现的次数,不需要记住ASCII码对应的ASCII码是多少
class Solution{
public boolean isAnagram(String s, String t){
int record = new int[26];
for(int i = 0, i < s.length(), i++){
record[s.charAt(i)-'a']++;// 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
}
}
}
遍历字符串t,读取t中字母对应的ASCII码并和遍历s之后的record相减,如果record为0则return true,反之则return false:
class Solution{
public boolean isAnagram(String s, String t){
int record = new int[26];
for(int i = 0, i < s.length(), i++){
record[s.charAt(i)-'a']++;// 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
}
for(int i = 0, i < t.length()< i++){
record[t.charAt(i)-'a']--;
}
}
}
用增强for循环遍历record数组,如果数组中还有元素,则说明s和t不是有效的字母异位词,return false;如果数组中没有元素,则说明s和t是有效的字母异位词,return true
ps:什么是 增强for循环?-->
增强for循环 (也称for each循环) 是迭代器遍历方法的一个“简化版”,是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合。其内部原理是一个Iteration迭代器,在遍历数组/集合的过程中,不能对集合中的元素进行增删操作。
增强for循环的使用
1.使用范围:用来遍历集合和数组(必须有遍历目标,目标只能是集合或者数组),所有单列表集合都可以使用增强for循环。
2.格式如下:
for(ElementType element: arrayName)
{ //集合或数组的数据类型 变量名:集合名/数组名
System.out.println(变量名);
};
上述for循环可被读为:
for each element in arrayName do {…}
回到本题的代码实现:
for(int count : record){
if( int count != 0 ){
return false;
}
return true;
}
综合代码:
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for (int i = 0; i < s.length(); i++) {
record[s.charAt(i) - 'a']++; // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
}
for (int i = 0; i < t.length(); i++) {
record[t.charAt(i) - 'a']--;
}
for (int count: record) {
if (count != 0) { // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
return false;
}
}
return true; // record数组所有元素都为零0,说明字符串s和t是字母异位词
}
}