/**
* 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
*
* 示例 1:
*
* 输入: s = "anagram", t = "nagaram"
* 输出: true
* 示例 2:
*
* 输入: s = "rat", t = "car"
* 输出: false
* 说明:
* 你可以假设字符串只包含小写字母。
*
* 进阶:
* 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
*/
方法1:
可以直接使用Hashmap,把第一个字符串保存到map中,第二个字符串判断是否都存在,key为字符串的每一个字符,value为出现的次数,时间复杂度为O(n*n)
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()) return false;
HashMap<Character,Integer> map = new HashMap<>();
//把s对应的值存入map中,统计出现的次数
for(int i = 0;i<s.length();++i){
if(map.containsKey(s.charAt(i))){
int value = map.get(s.charAt(i));
map.put(s.charAt(i),++value);
}
else{
map.put(s.charAt(i),1);
}
}
//从map中获取key判断是否相等,然后次数减1
for(int j = 0;j<t.length();++j){
if (map.containsKey(t.charAt(j))){
int value = map.get(t.charAt(j));
if(value>0) map.put(t.charAt(j),--value);
else return false;
}else{
return false;
}
}
return true;
}
方法2:
建立一个26长度的整型数组,获取第一个字符串的每一个字符减去‘a’,这样就可以计算出下标,然后value+1表示重复的个数,最后第二个字符串-1表示匹配的次数
public boolean isAnagram2(String s,String t){
if(s.length() != t.length()) return false;
int has[] = new int[26];
//记录了数目同时也知道了是哪一个,同时做对比
for(int i = 0;i<s.length();++i){
has[s.charAt(i)-'a']++;
has[t.charAt(i)-'a']--;
}
for (int ha : has) {
if(ha !=0) return false;
}
return true;
}
网友评论