LeetCode 242. Valid Anagram 有效的字母异位词(Java)

题目:

Given two strings s and t , write a function to determine if t is an anagram of s.

Example 1:
Input: s = “anagram”, t = “nagaram”
Output: true

Example 2:
Input: s = “rat”, t = “car”
Output: 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?

解答:

解法一:HashTable

采用HashTable,

  1. 遍历字符串s并写入map中,其中key是存在的字符,value是字符出现过的次数。
  2. 遍历字符串t,若map中不包含则直接return false,包含则key对应的value-1
  3. 遍历map,若每个key对应的value均为0,则说明s、t出现的字符和对应次数均相同return true
class Solution {
    public boolean isAnagram(String s, String t) {
        HashMap<Character, Integer> map = new HashMap<>();
        for(int i=0; i<s.length(); i++) {
            if(!map.containsKey(s.charAt(i))) {
                map.put(s.charAt(i), 1);
            }else{
                map.put(s.charAt(i), map.get(s.charAt(i))+1);
            }
        }
        for(int i=0; i<t.length(); i++) {
            if(map.containsKey(t.charAt(i))) {
                map.put(t.charAt(i), map.get(t.charAt(i))-1);
            }else{
                return false;
            }
        }
        for(int i=0; i<s.length(); i++) {
            if(map.get(s.charAt(i))!=0) {
                return false;
            }
        }
        return true;
    }
}
解法二:数组

用相同的思路,也可以将map改为数组形式,创建26位数组,每个数组位置代表从a-z字符的出现次数,同时遍历两个数组,s中出现则对应数组位+1,t出现则对应数组位-1。最终若所有数组位均为0,则return true

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length()) {
            return false;
        }
        int[] num = new int[26];
        for(int i=0; i<s.length(); i++) {
            num[s.charAt(i)-'a']++;
            num[t.charAt(i)-'a']--;
        }
        for(int i:num) {
            if(i!=0) {
                return false;
            }
        }
        return true;
    }
}

上述两种方法,解法二时间 < 解法一。

你可能感兴趣的:(LeetCode)