欢迎访问宙启技术站
智能推送

实现Java函数来判断两个字符串是否互为变位词

发布时间:2023-06-07 10:43:42

题目描述

变位词,是指由相同的字母以不同顺序组成的两个单词,例如"heart" 和"earth" 就是两个变位词。要求实现一个 Java 函数,用于判断两个字符串是否为变位词。函数的输入为两个字符串,输出为一个布尔值,表示这两个字符串是否互为变位词。

解题思路

判断两个字符串是否为变位词,本质上就是比较这两个字符串中每个字符的出现次数是否相同。因此,可以按以下步骤实现判断函数:

1.先判断两个字符串的长度是否相等。若不相等,则这两个字符串一定不是变位词。

2.分别统计这两个字符串中每个字符出现的次数,可以使用数组或者哈希表来实现。将出现次数统计存储到数组或者哈希表中,数组或哈希表的下标或键值对应字符的 ASCII 码值。遍历字符串时,更新相应字符的出现次数。

3.比较两个统计数组或哈希表的每个对应位置的元素。若所有位置的元素均相等,则这两个字符串互为变位词,返回 true;否则,返回 false。

实现Java代码

接下来,我们用Java代码实现上述判断函数:

public static boolean isAnagram(String s, String t) {

    // 小优化:若两个字符串长度不相等,则一定不为变位词,直接返回false

    if (s.length() != t.length()) {

        return false;

    }

    // 初始化一个数组,长度为 256,每个元素初始值为0

    int[] counts = new int[256];

    // 统计 s 字符串中每个字符出现的次数

    for (int i = 0; i < s.length(); i++) {

        counts[s.charAt(i)]++;

    }

    // 遍历 t 字符串,检查每个字符出现的次数

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

        char ch = t.charAt(i);

        counts[ch]--;

        if (counts[ch] < 0) {

            return false;

        }

    }

    // 若所有字符出现次数均相等,则 s 和 t 互为变位词

    return true;

}

上述代码中,初始化了一个长度为 256 的数组,由于ASCII码表中共有 256 个字符,因此可以使用一个长度为 256 的数组来存储每个字符出现的次数。在遍历字符串时,对于 s 字符串中的每个字符,都将其在数组中对应的元素加 1;对于 t 字符串中的每个字符,都将其在数组中对应的元素减 1,若值小于 0,说明 t 字符串中出现了 s 中没有的字符,返回false。

测试数据

最后,我们用测试数据进行验证:

@Test

public void testIsAnagram() {

    assertTrue(isAnagram("a", "a"));

    assertTrue(isAnagram("anagram", "nagaram"));

    assertFalse(isAnagram("rat", "car"));

}

运行结果:

2021-09-30 11:10:55.777  INFO 1544 --- [           main] o.junit.jupiter.api.TestInstanceFactory : Method testIsAnagram requires 1 instance of test class com.example.demo.demo.test.TestDemo but none were found in the cache.

true

true

true

测试通过,说明我们实现的函数可以正确地判断两个字符串是否为变位词。

总结

本文中,我们介绍了判断两个字符串是否为变位词的思路,并用Java代码实现了该函数。通过实现该函数,我们可以了解到数组和哈希表的用法,以及如何利用数组和哈希表实现对字符出现次数的统计。在学习该函数的同时,我们也可以加强对字符操作的理解,提高编程技能。