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.
题目的意思就是是否两个字符串之间可以通过颠倒次序来实现:
1 class Solution { 2 public: 3 bool isAnagram(string s, string t) { 4 int szS = s.size(); 5 int szT = t.size(); 6 if (szS != szT)return false; 7 sort(s.begin(), s.end()); 8 sort(t.begin(), t.end()); 9 for(int i = 0; i < szS; ++i){ 10 if (s[i] != t[i]) 11 return false; 12 } 13 return true; 14 } 15 };
再看一遍题目感觉上面写的有点蠢了, 其实排序完成之后直接比较两个字符串是否相等就可以了,不过这种排序之后再比较的时间复杂度为O(NlogN),可以通过计数的方尝试将复杂度降低到O(N),两种方式的java代码如下所示:
第一种:排序
1 public class Solution { 2 public boolean isAnagram(String s, String t) { 3 char[] sArr = s.toCharArray(); 4 char[] tArr = t.toCharArray(); 5 Arrays.sort(sArr); 6 Arrays.sort(tArr); 7 return String.valueOf(sArr).equals(String.valueOf(tArr)); 8 } 9 }
第二种: 计数法
1 public class Solution { 2 public boolean isAnagram(String s, String t) { 3 char [] count = new char [26]; 4 for(int i = 0; i < s.length(); ++i){ 5 count[s.charAt(i)-'a']++; 6 } 7 for(int i = 0; i < t.length(); ++i){ 8 count[t.charAt(i)-'a']--; 9 } 10 for(int i = 0; i < 26; ++i){ 11 if(count[i] != 0) 12 return false; 13 } 14 return true; 15 } 16 }
计数法的runtime实际上比前面的排序方法号上很多,但是有一点吐槽一下,现在leetCode上面的runtime为什么都是java比c++要快上很多啊,java现在有这么快吗,有点不能理解啊。