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;*/
    }
}


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