Leetcode 242. Valid Anagram-判断是否是 相同字母异序词

116 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

Given two strings s and t, return true if t is an anagram of s, and false otherwise.  

An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.

Example 1:

Input: s = "anagram", t = "nagaram"
Output: true

Example 2:

Input: s = "rat", t = "car"
Output: false

Constraints:

  • 1 <= s.length, t.length <= 5 * 104
  • s and t consist of lowercase English letters.

Follow up: What if the inputs contain Unicode characters? How would you adapt your solution to such a case?

package com.string;
 
import java.util.Arrays;
 
/**
 * @Author you guess
 * @Date 2022/4/8 22:05
 * @Version 1.0
 * @Desc 给定 s t 判断是否是  相同字母异序词
 */
public class Leetcode_242_ValidAnagram {
 
    /**
     * 方法1: c - 'a',遍历s把指定下标的元素加1 ,遍历t把指定下标的元素减1,遍历数组,只要有一位不为0则返回false
     * Runtime: 5 ms, faster than 65.98% of Java online submissions for Valid Anagram.
     * Memory Usage: 43 MB, less than 81.66% of Java online submissions for Valid Anagram.
     *
     * @param s
     * @param t
     * @return
     */
    public boolean isAnagram1(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
 
        //不可是Integer[] bArr = new Integer[10];初始化元素都是null
        int[] arr = new int[26];//初始化元素都是0
        for (int i = 0; i < s.length(); i++) {
            arr[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            arr[t.charAt(i) - 'a']--;
        }
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != 0) return false;
        }
        return true;
    }
 
 
    /**
     * 方法2: char c,arr[c],遍历s把指定下标的元素加1 ,遍历t把指定下标的元素减1,遍历数组,只要有一位不为0则返回false
     * Runtime: 2 ms, faster than 98.98% of Java online submissions for Valid Anagram.
     * Memory Usage: 42.4 MB, less than 90.39% of Java online submissions for Valid Anagram.
     *
     * @param s
     * @param t
     * @return
     */
    public boolean isAnagram2(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] arr = new int[123];//a-z 97-122
        for (int i = 0; i < s.length(); i++) {
            arr[s.charAt(i)]++;//作用与下一行代码一致,把指定下标的元素加1
            //arr[(int)s.charAt(i)]++;
        }
        for (int i = 0; i < t.length(); i++) {
            arr[t.charAt(i)]--;
            //arr[(int)t.charAt(i)]--;
        }
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != 0) return false;
        }
        return true;
    }
 
 
    /**
     * 方法3:方法2的优化,遍历t时可以直接判断,不用最后遍历一遍结果数组
     * <p>
     * Runtime: 3 ms, faster than 92.89% of Java online submissions for Valid Anagram.
     * Memory Usage: 42.3 MB, less than 92.47% of Java online submissions for Valid Anagram.
     *
     * @param s
     * @param t
     * @return
     */
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] arr = new int[123];//a-z 97-122
        for (int i = 0; i < s.length(); i++) {
            arr[s.charAt(i)]++;//作用与下一行代码一致,把指定下标的元素加1
            //arr[(int)s.charAt(i)]++;
        }
        for (int i = 0; i < t.length(); i++) {
            if (arr[t.charAt(i)] > 0) {
                arr[t.charAt(i)]--;
            } else {
                return false;
            }
        }
        return true;
    }
 
 
    public static void main2(String[] args) {
        Leetcode_242_ValidAnagram main = new Leetcode_242_ValidAnagram();
//        System.out.println(main.isAnagram("afcv", "cvfa"));//true
//        System.out.println(main.isAnagram("afcv", "cvfad"));//false
        System.out.println(main.isAnagram("afcvb", "cvfad"));//false
    }
 
    public static void main(String[] args) {
        int[] crr = new int[200];
        char a = 'a';
        System.out.println(crr[a]);//0
        System.out.println(crr[a]--);//0
        System.out.println(crr[a] + 2);//1
 
        
 
        int[] arr = new int[10];//初始化正确
 
        System.out.println(arr[0]);//0
        System.out.println(arr[0] + 1);//1
        System.out.println(arr[0] - 1);//-1
        System.out.println('b' - 'a');//1
 
        Integer[] bArr = new Integer[10];//初始化正确
        System.out.println(bArr[0]);//null
        //System.out.println(bArr[0]++);//NullPointerException
        //System.out.println(bArr[0]--);//NullPointerException
 
        Integer[] cArr = new Integer[]{1, 2};//初始化正确
        //Integer[] dArr = new Integer[2]{1,2};//报错
 
        
 
        char c = 'c';
        System.out.println(c);//c
        System.out.println((int) c);//99
        int cint = c;
        System.out.println(cint);//99
 
        
 
        String s = "askcbd";
 
        char[] sarr = s.toCharArray();
        System.out.println(sarr);//askcbd
 
        Arrays.sort(sarr);//返回void
        System.out.println(sarr);//abcdks
 
        String s2 = new String(sarr);
        System.out.println(s2);//abcdks
 
        String s3 = String.valueOf(sarr);
        System.out.println(s3);//abcdks
    }
}

end