Write a method to decide if two strings are anagrams or not.
public boolean anagram(String s, String t) { // write your code here if(s == null && t == null) return true; if(s == null || t == null) return false; if(s.length() != t.length()) return false; int[] recordS = new int[256]; int[] recordT = new int[256]; for(int i = 0 ; i < s.length() ; i++){ recordS[s.charAt(i)]++; recordT[t.charAt(i)]++; } for(int i = 0 ; i < recordS.length ; i++){ if(recordS[i] != recordT[i]){ return false; } } return true; } };
import java.util.Hashtable; public class Anagram { public static boolean anagram(String a, String b){ if(a.length() != b.length()) return false; Hashtable<Character, Integer> map = new Hashtable<Character, Integer>(); for(int i = 0 ; i < a.length() ; i++){ char chars = a.charAt(i); Integer index = (Integer) map.get( chars );//key point! char convert to int if(map.containsKey(chars)){ map.put(chars,index); } else{ map.put(chars,1); } // char[] charsArray = a.toCharArray(); // if(map.containsKey(charsArray[i])){ // map.put(charsArray[i],map.get(charsArray[i]) +1); // } // else{ // map.put(charsArray[i],1); // } } for(int i = 0 ; i < b.length() ; i++){ char chars = b.charAt(i); Integer index = (Integer) map.get( chars ); if(map.containsKey(chars) && index>0){ map.put(chars,index-1); } else{ return false; } } return true; } public static void main(String[] args){ String a = "abcdfsafgqqqwww"; String b = "acbdfsagfwwwqqq"; System.out.print(anagram(a,b)); } }
mistake: hashmap key只能用Integer
learned: An int is a primitive. It is not an Object.
An Integer, is a Object that contains a single int field. An Integer is much bulkier than an int. It is sort like a Fedex box to contain the int. Integers are immutable. If you want to affect the value of a Integer variable, the only way is to create a new Integer object and discard the old one.
// to int i from Integer iiint i = ii.intValue();// to Integer ii from int iInteger ii = new Integer( i );