代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

242. 有效的字母异位词 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

学透哈希表,数组使用有技巧!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是字母异位词
    }
}

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值