LeetCode OJ: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.

题目的意思就是是否两个字符串之间可以通过颠倒次序来实现:

 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现在有这么快吗,有点不能理解啊。

posted @ 2015-10-17 11:19  eversliver  阅读(324)  评论(0编辑  收藏  举报