【LeetCode每日一题】242. 有效的字母异位词

【LeetCode每日一题】242. 有效的字母异位词

一、题目

原题地址:242. 有效的字母异位词

在这里插入图片描述

二、题解

方法一:排序

1.思路及算法

  • ts 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 st 分别排序,看排序后的字符串是否相等即可判断。此外,如果 st 的长度不同,t必然不是 s 的异位词。

2.代码

/**
 * @author : lightupworld
 * @description: leetcode-cn.com/problems/valid-anagram/solution/you-xiao-de-zi-mu-yi-wei-ci-by-leetcode-solution/
 * @date 2021/5/21 19:45
 */
public boolean isAnagram(String s, String t) {
   if (s.length() != t.length()) {
       return false;
   }
   char[] str1 = s.toCharArray();
   char[] str2 = t.toCharArray();
   Arrays.sort(str1);
   Arrays.sort(str2);
   return Arrays.equals(str1, str2);
}

3.复杂度分析
在这里插入图片描述
4.注意事项

  • ①字符串常用排序方法
    1. 字符串转字符
    Char[] ch =  s.toCharArray();
    
    2.排序
    Arrays.sort(ch);
    

方法二:哈希表

1.思路及算法

  • 创建一个map 遍历 s ,记录字符 和 对应出现的次数, 出现一次 ++,再去遍历t,记录出现字符 和次数,出现相容的就-1,最后遍历map 如果value 有为1 的那就说明不是异位词。
  • 使用hashmap 即使出现unicode也能解决问题。

2.代码

public static boolean isAnagram(String s, String t) {
    if( s == null || t == null || s.length() != t.length() || s.length() == 0 || t.length() == 0 ) {
        return  false;
    }
    Map<Character, Integer> hashMap = new HashMap<>();
    Arrays.sort(s.toCharArray());

    //遍历s  map存储
    for (int i = 0; i < s.length(); i++) {
        Integer cnt  = hashMap.get(s.charAt(i));
        cnt = cnt == null ? 1 : ++cnt;
        hashMap.put(s.charAt(i), cnt);
    }

    //遍历t
    for (int i = 0; i < t.length(); i++) {

        Integer cnt = hashMap.get(t.charAt(i));

        cnt = cnt == null ? 1 : --cnt;
        hashMap.put(t.charAt(i), cnt);

        if (hashMap.get(t.charAt(i)) < 0) {
            return false;
        }
    }

    //遍历map
    for (Map.Entry<Character, Integer> entry: hashMap.entrySet()) {
        if (entry.getValue() != 0) {
            return false;
        }
    }

    return true;
}

优化: 在遍历t的时候,就可以判断map的值,不用最后单独再去遍历一次。

public boolean isAnagram(String s, String t) {
    if (s.length() != t.length()) {
        return false;
    }
    Map<Character, Integer> table = new HashMap<Character, Integer>();
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        table.put(ch, table.getOrDefault(ch, 0) + 1);
    }
    for (int i = 0; i < t.length(); i++) {
        char ch = t.charAt(i);
        table.put(ch, table.getOrDefault(ch, 0) - 1);
        if (table.get(ch) < 0) { //即使t出现s中没有的,存入map的值会是-1 所以判断 < 0 就可以得到正确结果。
            return false;
        }
    }
    return true;
}

3.复杂度分析

  • 时间复杂度:O(n),其中 n 为s 的长度。

  • 空间复杂度:O(S),其中 S 为字符集大小,此处S=26。

4.注意事项

https://leetcode-cn.com/problems/valid-anagram/solution/you-xiao-de-zi-mu-yi-wei-ci-by-leetcode-solution/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值