题目:
Given two strings s and t , write a function to determine if t is an anagram of s.
Example 1:
Input: s = “anagram”, t = “nagaram”
Output: true
Example 2:
Input: s = “rat”, t = “car”
Output: false
Note:
You may assume the string contains only lowercase alphabets.
Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?
解答:
解法一:HashTable
采用HashTable,
- 遍历字符串s并写入map中,其中key是存在的字符,value是字符出现过的次数。
- 遍历字符串t,若map中不包含则直接return false,包含则key对应的value-1
- 遍历map,若每个key对应的value均为0,则说明s、t出现的字符和对应次数均相同return true
class Solution {
public boolean isAnagram(String s, String t) {
HashMap<Character, Integer> map = new HashMap<>();
for(int i=0; i<s.length(); i++) {
if(!map.containsKey(s.charAt(i))) {
map.put(s.charAt(i), 1);
}else{
map.put(s.charAt(i), map.get(s.charAt(i))+1);
}
}
for(int i=0; i<t.length(); i++) {
if(map.containsKey(t.charAt(i))) {
map.put(t.charAt(i), map.get(t.charAt(i))-1);
}else{
return false;
}
}
for(int i=0; i<s.length(); i++) {
if(map.get(s.charAt(i))!=0) {
return false;
}
}
return true;
}
}
解法二:数组
用相同的思路,也可以将map改为数组形式,创建26位数组,每个数组位置代表从a-z字符的出现次数,同时遍历两个数组,s中出现则对应数组位+1,t出现则对应数组位-1。最终若所有数组位均为0,则return true
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length()!=t.length()) {
return false;
}
int[] num = new int[26];
for(int i=0; i<s.length(); i++) {
num[s.charAt(i)-'a']++;
num[t.charAt(i)-'a']--;
}
for(int i:num) {
if(i!=0) {
return false;
}
}
return true;
}
}
上述两种方法,解法二时间 < 解法一。