Leetcode:242. 有效的字母异位词

Leetcode:242. 有效的字母异位词

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true
示例 2:

输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。

进阶:

如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

思路

思路1: 哈希表

直接使用哈希表计数,先计算s的每个字母个数相加,然后计算t中个数相减

思路2:数组+计数

鉴于只有26个字母,所以可以只用一个数组计数,解法可同上,但是常数空间消耗更少

代码

代码1:哈希表

class Solution {
    public boolean isAnagram(String s, String t) {
        if ((s == null && t != null) || (s != null && t == null) || s.length() != t.length()) {
            return false;
        }
        Map chMap = new HashMap<>();
        for(char ch: s.toCharArray()){
            if (!chMap.containsKey(ch)){
                chMap.put(ch, 1);
            }
            chMap.put(ch, chMap.get(ch) + 1);
        }
        for(char ch: t.toCharArray()){
            if(!chMap.containsKey(ch) || chMap.get(ch) != 0){
                return false;
            } else{
                chMap.put(ch, chMap.get(ch) - 1);
            }
        }
        return true;
    }
}

代码2:数组+计数

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

复杂度分析

时间复杂度

n

空间复杂度

1,常数


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:387. 字符串中的第一个唯一字符 Leetcode:387. 字符串中的第一个唯一字符
Leetcode:387. 字符串中的第一个唯一字符题目描述给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 案例:s = "leetcode" 返回 0. s = "
2020-03-23
下一篇 
Leetcode 212: 单词搜索II Leetcode 212: 单词搜索II
Leetcode 212: 单词搜索II题目描述给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相
2020-03-21
  目录