1.题目
给定两个字符串
s
和t
,编写一个函数来判断t
是否是s
的字母异位词。注意:若
s
和t
中每个字符出现的次数都相同,则称s
和t
互为字母异位词。
2.示例
s="adasd"
t="daads"
返回true
s="addad"
t ="adddt"
返回true
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
3.思路
统计字符:
首先可以通过统计两者的每一个字符出现的次数进行统计,然后通过遍历两者26个字母判断是否都能相等,如果都能相等则返回true否则为false
4.代码
LeetCode代码:
class Solution {
public boolean isAnagram(String s, String t) {
int count_s[] = new int[26];
int count_t[] = new int[26];
for (char s_index:s.toCharArray()) {
count_s[s_index-'a']++;
}
for (char t_index:t.toCharArray()) {
count_t[t_index-'a']++;
}
for (int i=0;i<26;i++){
if (count_s[i]!=count_t[i]){
return false;
}
}
return true;
}
}
可以看到内存管理并不理想,所以可以尝试将两个数组结合起来变成一个数组,即为累加数组,在s数组中累加,在t数组中累减。最后通过数组内的元素是否有不为0的元素来判断返回值
改良后代码:
class Solution {
public boolean isAnagram(String s, String t) {
int sum[] = new int[26];
for (char s_index:s.toCharArray()) {
sum[s_index-'a']++;
}
for (char t_index:t.toCharArray()) {
sum[t_index-'a']--;
}
for (int i=0;i< sum.length;i++){
if (sum[i]!=0){
return false;
}
}
return true;
}
}
详细案例代码:
package LeetCode15_1;
public class javaDemo {
public static void main(String[] args) {
String s = "rat";
String t = "car";
boolean flag = false;
// 创建唯一累加数组
int sum[] = new int[26];
// 遍历s,统计s所有字母的出现次数
for (char s_index:s.toCharArray()) {
sum[s_index-'a']++;
}
// 遍历t,减去t所有字母出现的次数
for (char t_index:t.toCharArray()) {
sum[t_index-'a']--;
}
// 如果两者出现次数都一样,那么数组元素应该全是0
for (int i=0;i< sum.length;i++){
if (sum[i]!=0){
flag = false;
break;
}
}
System.out.println(flag);
}
}