LeetCode--242. Valid Anagram

来源:互联网 发布:淘宝账号回收 编辑:程序博客网 时间:2024/05/17 06:13

Problem:

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.Follow up:What if the inputs contain unicode characters? How would you adapt your solution to such case?

Analysis:
这个题目前想到三种方法,
第一:用hash,将s中的每个字符存入key,value存这个字符出现的次数。如果t中发现这个字符则value减1,如果t中的字符在hash中没有找到则返回false。
第二:用字符数组,将每个字符的个数存入相应的数组中。
第三:排序然后判断排序后的字符数组是否相等
Answer:
hash方法:

public class Solution {    public boolean isAnagram(String s, String t) {        //判断边界条件        if(s==null && t==null) return true;        if(s==null || t==null) return false;        //利用s和t的长度不等返回减少时间        int sLen=s.length();        int tLen=t.length();        if(sLen!=tLen) return false;        HashMap<Character,Integer> map = new HashMap<Character,Integer>();        for(int i=0;i<sLen;i++){            if(map.containsKey(s.charAt(i))) map.put(s.charAt(i),map.get(s.charAt(i))+1);            else map.put(s.charAt(i),1);        }        for(int i=0;i<tLen;i++){            if(map.containsKey(t.charAt(i))){                int temp = map.get(t.charAt(i));                if(temp>0)  map.put(t.charAt(i),temp-1);                else return false;            }             else return false;        }        return true;    }}

字符数组方法:

public boolean isAnagram(String s, String t) {    // we do the following assumptions:    // - s and t do not contain any whitespaces which have to be removed    // - s and t do not contain ascii characters    char[] sMap = map(s);    char[] tMap = map(t);    return (Arrays.equals(sMap, tMap));}private char[] map(String s){    char[] map = new char[128];    for (int i = 0; i < s.length(); i++)    {        char c = s.charAt(i);        map[c] += 1;    }    return map;}

下面是用hash的另一种解法,同时便利s和t,如果t中的字符在map中有则减1,如果没有则赋值为-1:

   for(int i=0; i<n; i++){        charset.put(s.charAt(i), charset.containsKey(s.charAt(i)) ? charset.get(s.charAt(i))+1 : 1);        charset.put(t.charAt(i), charset.containsKey(t.charAt(i)) ? charset.get(t.charAt(i))-1 : -1);    }    for(int i: charset.values()){        if (i!=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));      }  }  

经验:

  1. for(int i: charset.values()),map的values()方法。
  2. 利用字符数组,常规的字符128个,总的256个。
  3. char[] S= s.toCharArray();字符串转字符数组方法。
  4. Arrays.sort(S);数组排序方法。
0 0
原创粉丝点击