Valid Anagram (java)

题目:
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.

理解题意:字符串t是字符串s中一些或者全部字母颠倒顺序得到的,就是anagram。

初始想法:用一个hashMap<Integer,Character> 遍历保存s中字符,然后遍历t字符串,若遍历的当前字符不存在map 中,直接返回false;若字符包含在map中,则删除改映射。实现上有问题,hashMapcontainsValue(Object value) 函数返回的是布尔值,无法得到key ,就不能通过remove 函数删除映射关系。

正确思路:hashMap<Character, Integer> 遍历保存s中字符key 为字符,value 为字符出现的次数。在遍历t中字符时,若当前字符在map 中不存在,返回false;若存在,通过hashMap.get(Object key) 得到该字符出现的次数,减一,更新hashmap 。最后看map 的value的视图集合中,值是否有不等于0的,若没有则是anagram。

代码实现:

public class Solution {
    public boolean isAnagram(String s, String t) {
    if(s.length() != t.length()) return false;

        Map< Character, Integer> sMap = new HashMap<Character, Integer>();
        for(int i=0; i< s.length(); ++i)
        {
            if(sMap.containsKey(s.charAt(i)))
            {
                int tmp = sMap.get(s.charAt(i))+1;
                sMap.put(s.charAt(i), tmp);
            }
            else{
                sMap.put(s.charAt(i), 1);
            }
        }

        for(int j =0 ; j<t.length(); ++j)
        {
            if(!sMap.containsKey(t.charAt(j))) return false;
            else{
                int tmp = sMap.get(t.charAt(j))-1;
                sMap.put(t.charAt(j), tmp);
            }
        }
        Set<Character> keySet = sMap.keySet();
        Iterator<Character> iter= keySet.iterator();
        while(iter.hasNext())
        {
            Character  key = iter.next();
            if(sMap.get(key)!=0)
                return false;
        }
        return true;

    }
}

在网上看到另解:
因为变形词两个单词对应字母出现的次数都相同,所以如果将两个单词按字母顺序排序,肯定会变为一个字符串,如果字符串不相同,则不是变形词。

public class Solution {
    public boolean isAnagram(String s, String t) {
        char[] sArr=s.toCharArray();
        char[] tArr=t.toCharArray();
        Arrays.sort(sArr);
        Arrays.sort(tArr);
        return String.valueOf(sArr).equals(String.valueOf(tArr));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值