LeetCode - 242. Valid Anagram

这道题与cc 150 1.3类似,可以有多种解法,最为方便的一种就是排序,然后检查两个String[]是否相等。时间复杂度为O(nlogn),空间复杂度为O(n),代码如下:

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);
}


根据题目中只含有小写字母的性质,我们也可以使用hash table的方法来解决这道题目,注意这里的hash table并不使用Java提供的,而是使用一个长度为26的数组(因为小写字母只有26个),同时也要注意这里的一个技巧,就是使用s.charAt(i) - 'a'来的到当前char所应该在的index,时间复杂度为O(n),空间复杂度为O(1),代码如下:

public class Solution {
    public boolean isAnagram(String s, String t) {
        if(s == null && t == null) return true;
        if(s == null || t == null) return false;

        if(s.length() != t.length()) return false;

        int[] alphabet = new int[26];
        for(int i = 0; i < s.length(); i++) alphabet[s.charAt(i) - 'a']++;
        for(int i = 0; i < t.length(); i++) alphabet[t.charAt(i) - 'a']--;
        for(int i : alphabet) if(i != 0) return false;
        return true;
    }
}


知识点:

1. 注意这道题目可以进行扩展为检查一个字符串是否是另一个字符串打乱后的结果,方法与这道题目比较相似,但是确认题目中的编码方式,如果是ASCII的话,那么第二种方法中申请的数组的长度应该为256

2. 记住一个小技巧,就是使用char - ‘a'来得到char相对于'a'的偏差,可以用这种方法方便地获取index

3. 这里首先对两个字符串的长度进行判断,是一种很好的预处理,可以节省很多的时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值