242. Valid Anagram

Given two strings s and t, write a function to determine if t is an anagram of s.
For example:
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.

Note: You may assume the string contains only lowercase alphabets.

Follow up: What if the inputs contain unicode characters? How would you adapt your solution to such case?

Solution:

这题看上去和 383. Ransom Note 差不多,都是求后者是不是可以由前者所含有的字符置换顺序所得。但不同之处在于 Ransom Note 不需要用完前者所有的字符,而这里需要用完前者所有的字符。
顺着这个思路,在 Ransom Note的基础上最后用iterator在values的Collection中遍历一遍看是否都为0了,如果有大于0的说明该字符没有被后者用完,也就不是Anagram了。

注意1:迭代器Iterator 有个重要的性质是当第一次执行next()方法后,指向首个元素,而不是第二个元素。

注意2: 迭代器是一个泛型,类型T为定义它时需要它指向的元素的类型。

注意3:当需要返回HashMap上的迭代器时,注意是hashMap.keySet().iterator() 还是 hashMap.values().iterator()。前者返回一个包含所有key值的Set上的迭代器,后者返回一个包含所有value值的Collection上的迭代器。(Set上不允许重复,Collection上可以有重复元素)

注意4:还可以通过 EntrySet().iterator() 上的迭代器来遍历

Code:

public class Solution 
{
    public boolean isAnagram(String s, String t) 
    {
        HashMap hm = new HashMap<>();
        for(int i = 0; i < s.length(); i++)
        {
            int newCount = hm.getOrDefault(s.charAt(i), 0) + 1;
            hm.put(s.charAt(i), newCount);
        }
        for(int j = 0; j < t.length(); j++)
        {
            int newCount = hm.getOrDefault(t.charAt(j), 0) - 1;
            if(newCount < 0)
                return false;
            else
                hm.put(t.charAt(j), newCount);
        }        
        Iterator itr = hm.values().iterator();
        while(itr.hasNext())
        {
            if(itr.next() > 0)
                return false;
        }
        return true;
    }
}

然而参考Discussion后发现自己思维惯性了。后者是否是由前者所有的字符组合而来的一个必要条件就是两者的长度首先要相等。在长度相等的情况下,就可以直接使用Ransom Note的思路(因为等长的情况下不会出现没有用尽前者中的字符就已经组合齐全了)

public boolean isAnagram(String s, String t) 
{
        if(s.length() != t.length()) 
            return false;       
        HashMap map = new HashMap<>();
        for(Character c : s.toCharArray())
        {
            int count = map.getOrDefault(c,0)+1;
            map.put(c,count);
        }
        for(Character c : t.toCharArray())
        {
            int count = map.getOrDefault(c,0)-1;
            if(count < 0) return false;
            map.put(c,count);
        }
        return true;
  }

你可能感兴趣的:(242. Valid Anagram)