返回

深入剖析01.02 题解:判定字符是否重排,精通 Java、C++ 与 Rust

后端

Java 题解

import java.util.HashMap;

class Solution {
    /**
     * 哈希表法
     *
     * @param s1 第一个字符串
     * @param s2 第二个字符串
     * @return 是否为字符重排
     */
    public boolean isAnagram(String s1, String s2) {
        if (s1.length() != s2.length()) {
            return false;
        }

        // 创建哈希表存储 s1 中每个字符出现的次数
        HashMap<Character, Integer> charCount = new HashMap<>();
        for (char c : s1.toCharArray()) {
            charCount.put(c, charCount.getOrDefault(c, 0) + 1);
        }

        // 检查 s2 中每个字符出现的次数是否与 s1 中相同
        for (char c : s2.toCharArray()) {
            int count = charCount.getOrDefault(c, 0);
            if (count == 0) {
                return false;
            } else {
                charCount.put(c, count - 1);
            }
        }

        return true;
    }
}

C++ 题解

#include <unordered_map>

class Solution {
public:
    /**
     * 哈希表法
     *
     * @param s1 第一个字符串
     * @param s2 第二个字符串
     * @return 是否为字符重排
     */
    bool isAnagram(string s1, string s2) {
        if (s1.length() != s2.length()) {
            return false;
        }

        // 创建哈希表存储 s1 中每个字符出现的次数
        unordered_map<char, int> charCount;
        for (char c : s1) {
            charCount[c]++;
        }

        // 检查 s2 中每个字符出现的次数是否与 s1 中相同
        for (char c : s2) {
            if (charCount.find(c) == charCount.end() || charCount[c] == 0) {
                return false;
            } else {
                charCount[c]--;
            }
        }

        return true;
    }
};

Rust 题解

use std::collections::HashMap;

struct Solution;

impl Solution {
    /**
     * 哈希表法
     *
     * @param s1 第一个字符串
     * @param s2 第二个字符串
     * @return 是否为字符重排
     */
    pub fn is_anagram(s1: String, s2: String) -> bool {
        if s1.len() != s2.len() {
            return false;
        }

        // 创建哈希表存储 s1 中每个字符出现的次数
        let mut char_count: HashMap<char, i32> = HashMap::new();
        for c in s1.chars() {
            *char_count.entry(c).or_insert(0) += 1;
        }

        // 检查 s2 中每个字符出现的次数是否与 s1 中相同
        for c in s2.chars() {
            if !char_count.contains_key(&c) || char_count[&c] == 0 {
                return false;
            } else {
                *char_count.get_mut(&c).unwrap() -= 1;
            }
        }

        true
    }
}

扩展思路

除了使用哈希表来判定字符是否重排,我们还可以使用排序的方法。排序后,如果两个字符串相等,则它们是字符重排。

import java.util.Arrays;

class Solution {
    /**
     * 排序法
     *
     * @param s1 第一个字符串
     * @param s2 第二个字符串
     * @return 是否为字符重排
     */
    public boolean isAnagram(String s1, String s2) {
        if (s1.length() != s2.length()) {
            return false;
        }

        // 将字符串转换为字符数组
        char[] s1Chars = s1.toCharArray();
        char[] s2Chars = s2.toCharArray();

        // 排序字符数组
        Arrays.sort(s1Chars);
        Arrays.sort(s2Chars);

        // 比较排序后的字符数组是否相等
        return Arrays.equals(s1Chars, s2Chars);
    }
}
#include <algorithm>

class Solution {
public:
    /**
     * 排序法
     *
     * @param s1 第一个字符串
     * @param s2 第二个字符串
     * @return 是否为字符重排
     */
    bool isAnagram(string s1, string s2) {
        if (s1.length() != s2.length()) {
            return false;
        }

        // 将字符串转换为字符数组
        char s1Chars[s1.length()];
        char s2Chars[s2.length()];
        for (int i = 0; i < s1.length(); i++) {
            s1Chars[i] = s1[i];
            s2Chars[i] = s2[i];
        }

        // 排序字符数组
        sort(s1Chars, s1Chars + s1.length());
        sort(s2Chars, s2Chars + s2.length());

        // 比较排序后的字符数组是否相等
        return equal(s1Chars, s1Chars + s1.length(), s2Chars);
    }
};
use std::collections::HashMap;

struct Solution;

impl Solution {
    /**
     * 排序法
     *
     * @param s1 第一个字符串
     * @param s2 第二个字符串
     * @return 是否为字符重排
     */
    pub fn is_anagram(s1: String, s2: String) -> bool {
        if s1.len() != s2.len() {
            return false;
        }

        // 将字符串转换为字符数组
        let s1_chars: Vec<char> = s1.chars().collect();
        let s2_chars: Vec<char> = s2.chars().collect();

        // 排序字符数组
        s1_chars.sort();
        s2_chars.sort();

        // 比较排序后的字符数组是否相等
        s1_chars == s2_chars
    }
}

总结

在本文中,我们详细介绍了 LeetCode 面试题 01.02:“判定是否为字符重排”的解法,并使用 Java、C++ 和 Rust 三种语言提供了详细的代码示例。此外,我们还介绍了另一种判定字符是否重排的方法:排序法。希望本文能够帮助您更好地理解字符重排的判定方法,并掌握相关语言的类和方法。