LeetCode - 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.


题意解析:

这个题和以前的 383.  Ransom Note  非常像。

Anagram 的意思是:回文构词法,也就是“由颠倒字母顺序而构成的字[短语]”。


思路与步骤:

思路1:

只要两个字符串中出现的字母和字母出现的次数一样,则表示是 Valid Anagram 。这样有两种解法:

解法1-1:

HashMap ,Key 为字母,Value 为字母的次数。这里我想到了两种方法:

第一种是将两个字符串都用这样的 HashMap 来存储,最后比较这俩是否相等。

第二种是将用第一个字符串初始化,然后对第二个字符串中的每个字母,如果在 map 中存在,则个数减1,最后 map 中的 Value 全为 0 ,则表示是 Anagram。

解法1-2:

思路同上面 1-1 中的第二种一样,只是改用 数组,数组的下标是字母(但是需要转化成整数)的 ASCII 码,即 schar - 'a' ,数组内容是字母出现的次数。


思路2:

逐个比较法,由于是 Anagram,即乱序的,所以先将两个字符串分别排序,然后逐个比较即可。


编程实现:

Solution-1

用两个 HashMap

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(char schar: s.toCharArray())    smap.put(schar, smap.getOrDefault(schar,0)+1);
        Map<Character, Integer> tmap = new HashMap<Character, Integer>();
        for(char tchar: t.toCharArray())    tmap.put(tchar, tmap.getOrDefault(tchar,0)+1);
        if(smap.equals(tmap)) return true;
        else return false;
    }
}

Solution-2

用一个字符串来初始化 HashMap,另一个字符串来判断

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(char schar: s.toCharArray())    smap.put(schar, smap.getOrDefault(schar,0)+1);
        for(char tchar: t.toCharArray()){
            if(smap.containsKey(tchar) && smap.get(tchar)>1) smap.put(tchar, smap.get(tchar)-1);
            else if(smap.containsKey(tchar) && smap.get(tchar)==1) smap.remove(tchar);
            else if(!smap.containsKey(tchar))   return false;
        }
        if(smap.isEmpty()) return true;
        else return false;
    }
}

Solution-3

用数组

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

Solution-4

先排序

public class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length())  return false;
        char[] sArray = s.toCharArray();
        char[] tArray = t.toCharArray();
        Arrays.sort(sArray);
        Arrays.sort(tArray);
        return Arrays.equals(sArray, tArray);
        /*int i=0;
        while(i < s.length() && sArray[i] == tArray[i])   i++;
        if(i == s.length()) return true;
        else return false;*/
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章