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.
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.
Note:
You may assume the string contains only lowercase alphabets.
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?
What if the inputs contain unicode characters? How would you adapt your solution to such case?
做法1:
把两个string都sort好,然后比较之。
Time: O(nlogn)
Space: O(1)
Time: O(nlogn)
Space: O(1)
这样的话答案78.41%
似乎比sort还要慢一些, 46.32%, 8ms。
Improve the 2nd solution: use a hashtable
public class Solution { public boolean isAnagram(String s, String t) { char[] ss = s.toCharArray(); Arrays.sort(ss); String sss = new String(ss); char[] tt = t.toCharArray(); Arrays.sort(tt); String ttt = new String(tt); return sss.equals(ttt); } }做法2: 用一个数组存起来
似乎比sort还要慢一些, 46.32%, 8ms。
public class Solution { public boolean isAnagram(String s, String t) { if (s.length() != t.length()) return false; else if (s.length() == 0) return true; int[] numbychar = new int[256]; int num_unique = 0; int num_complete = 0; char[] s_char = s.toCharArray(); for (char c : s_char) { if (numbychar[c] == 0) num_unique++; ++numbychar[c]; } for (int i = 0; i < t.length(); i++) { int c = (int) t.charAt(i); if (numbychar[c] == 0) return false; --numbychar[c]; if (numbychar[c] == 0) { ++num_complete; if (num_complete == num_unique) { return i==t.length()-1; } } } return false; } }
Improve the 2nd solution: use a hashtable
import java.util.*; public class Solution { public boolean isAnagram(String s, String t) { if(s.length()!=t.length()) return false; HashtabletheTableS = new Hashtable (), theTableT = new Hashtable (); for (char i:s.toCharArray()) { if (theTableS.containsKey(i)) theTableS.put(i,theTableS.get(i)+1); else theTableS.put(i,1); } for (char i:t.toCharArray()) { if (theTableT.containsKey(i)) theTableT.put(i,theTableT.get(i)+1); else theTableT.put(i,1); } return theTableT.equals(theTableS); } }
No comments:
Post a Comment