实现Java函数来判断两个字符串是否互为变位词
题目描述
变位词,是指由相同的字母以不同顺序组成的两个单词,例如"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代码实现了该函数。通过实现该函数,我们可以了解到数组和哈希表的用法,以及如何利用数组和哈希表实现对字符出现次数的统计。在学习该函数的同时,我们也可以加强对字符操作的理解,提高编程技能。
