【LeetCode】Valid Anagram 解题报告

原创 2016年04月30日 13:10:18

Valid Anagram

[LeetCode]

https://leetcode.com/problems/valid-anagram/

Total Accepted: 78186 Total Submissions: 187211 Difficulty: Easy

Question

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.

Ways

这个题刚开始我想的是通过s字符串的每个字符能否在t中找到的方式。这个显然是错的。没有考虑到多次出现的问题。即两字符串长度相等,而且每个字符出现的次数相同,那么就是变位词。

题目中说了只有小写,那就是只有26个字母。统计一下出现的频率就好了。两个字符串中如果出现的词的频率都一样则说明是变位词。

算法如下:

public class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length()){
            return false;
        }
       int[] sTimes=new int[26];
       int[] tTimes=new int[26];
       for(int i=0;i<s.length();i++){
           sTimes[s.charAt(i)-'a']+=1;
           tTimes[t.charAt(i)-'a']+=1;
       }
       for(int i=0;i<sTimes.length;i++){
           if(sTimes[i]!=tTimes[i]){
               return false;
           }
       }
       return true;
    }
}

AC:12ms

在上面看到了用到了两个数组进行保存。这样空间复杂度比较大,可以用一个进行保存。

对于s, 将其作为字符数组进行遍历,在遍历的过程中,对每个出现的字符计数加一。

对于t, 同样将其遍历,对每个出现的字符计数减一。

如果s和t是anagram , 那么最后的charcount数组中所有字符的计数都应该是0, 否则就不是anagram。

简化之后的代码:

public class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length()){
            return false;
        }
       int[] times=new int[26];
       for(int i=0;i<s.length();i++){
           times[s.charAt(i)-'a']+=1;
           times[t.charAt(i)-'a']-=1;
       }
       for(int i=0;i<times.length;i++){
           if(times[i]!=0){
               return false;
           }
       }
       return true;
    }
}

AC:10ms

另外提供一个思路:可以遍历s字符串,将t中的出现的同样的字符给替换为”“,看结束之后的结果是不是”“。写了一段代码,结果是超时。感觉时间复杂度不是太高,可能因为indexOf()方法本身就比计较耗时。

这个可以看出,字符串问题尽量转换为字符数组去做,效率比较高。用字符串本身的方法去操作很可能会超时。

public class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length()){
            return false;
        }
       for(int i=0;i<s.length();i++){
           if(t.indexOf(s.charAt(i))==-1){
               return false;
           }else{
               t.replace(""+s.charAt(i),"");
           }
       }
       if(!t.equals("")){
           return false;
       }
       return true;
    }
}

Date

2016/4/30 13:08:21

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

LeetCode 242. Valid Anagram 解题报告

LeetCode 242. Valid Anagram 解题报告

Leetcode 125. Valid Palindrome 回文验证 解题报告

1 解题思想就一个简单的判断一个string里面的字符和数字部分,是否是回文的,不考虑符号和大小写等其实说白了,就首尾指针对比一下就好。。 我代码里面首尾不同的地方时过滤下非字符数字2 原题Given...
  • MebiuW
  • MebiuW
  • 2016年10月13日 19:20
  • 529

[Leetcode] 65. Valid Number 解题报告

题目: Validate if a given string is numeric. Some examples: "0" => true " 0.1 " => true "abc" => fals...

[Leetcode] 36. Valid Sudoku 解题报告

题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board co...

[Leetcode] 32. Longest Valid Parentheses 解题报告

题目: Given a string containing just the characters '(' and ')', find the length of the longest val...

Leetcode 65. Valid Number 验证数字 解题报告

1 解题思想这道题条条框框是在太多了,各种情况。。不过简略来说,正确的做法应该是: 1、熟悉数字的表述规则(可以看网上的,也可以看我代码的),这道题关键是要懂所有的数字规则。 2、对输入的数字首先...
  • MebiuW
  • MebiuW
  • 2016年05月08日 23:44
  • 3521

【LeetCode】611.Valid Triangle Number解题报告

【LeetCode】611.Valid Triangle Number解题报告tags: Array 题目地址:https://leetcode.com/problems/valid-triangle...

[leetcode] 36. Valid Sudoku 解题报告

题目链接:https://leetcode.com/problems/valid-sudoku/ Determine if a Sudoku is valid, according to: Sud...

[leetcode] 32. Longest Valid Parentheses 解题报告

题目链接:https://leetcode.com/problems/longest-valid-parentheses/ Given a string containing just the c...

Leetcode #36. Valid Sudoku 数独游戏验证 解题报告

1 解题思想九宫格验证,验证这个数独游戏的棋盘是否合法,这题做的不是求解答案,只是看给定的棋盘是否合法!做法没什么特别的,分块,行,列都要验证,即一个分组单位里1-9有且只能出现一次注意空间优化2 原...
  • MebiuW
  • MebiuW
  • 2016年04月07日 23:59
  • 690
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【LeetCode】Valid Anagram 解题报告
举报原因:
原因补充:

(最多只允许输入30个字)