题目原址
https://leetcode.com/problems/valid-anagram/description/
题目描述
Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = “anagram”, t = “nagaram”, return true.
s = “rat”, t = “car”, return false.
Note:
You may assume the string contains only lowercase alphabets.
解题思路
给定两个字符串s和t,判断字符串t是否是字符串s打乱顺序后的字符串,如果是则返回true,否则返回false
解法一:
该题使用hashmap来解。将两个字符串分别放在两个hashmap中,键用来存储字符,值用来存储字符出现的个数。
如果两个字符串长度不等,则直接返回false;
利用增强for循环来判断s的map的值在t的map中是否存在,如果不存在返回false;如果存在进一步判断这个字符的个数在两个字符串中是否相同,如果不相同返回false,否则返回true
解法二:
使用hashmap的效率比较低,所以可以使用数组来解决该题。数组的下标存储字符的hashcode码,数组的元素存储元素的个数;
在一个for循环中,如果字符串s中存在的元素,则将对应的元素个数+1,如果字符串t中存在的元素,则将对应的元素个数-1
最后用增强for看数组中的元素是否不为0,如果不为0,就说明s中存在的元素在t中不存在。
AC代码
解法一:
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length())
return false;
Map<Character,Integer> map1 = new HashMap<Character,Integer>();
Map<Character,Integer> map2 = new HashMap<Character,Integer>();
boolean ret = true;
for(int i = 0; i < s.length(); i++) {
if(map1.containsKey(s.charAt(i))) {
map1.put(s.charAt(i), map1.get(s.charAt(i)) + 1);
}else
map1.put(s.charAt(i), 1);
if(map2.containsKey(t.charAt(i))) {
map2.put(t.charAt(i), map2.get(t.charAt(i)) + 1);
}else
map2.put(t.charAt(i), 1);
}
for(Character c: map1.keySet()) {
if(!map2.containsKey(c)) {
ret = false;
}else if(!map2.get(c).equals(map1.get(c)) ){
ret = false;
}
}
return ret;
}
}
解法二:
class Solution {
public boolean isAnagram(String s, String t) {
if(s.equals(t))
return true;
if(s==null||t==null||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;
}
}