几道利用哈希表的题
class Solution {
public boolean isAnagram(String s, String t) {
Map<Character,Integer> record = new HashMap<>();
for(Character c : s.toCharArray()){
record.put(c,record.getOrDefault(c,0) + 1);
}
for(Character c : t.toCharArray()){
if(record.containsKey(c)){
record.put(c,record.get(c) - 1);
if(record.get(c) == 0)
record.remove(c);
}else{
return false;
}
}
return record.size() == 0 ? true : false;
}
}
比较推荐下面这种做法
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length())
return false;
int[] table = new int[26];
for(char c : s.toCharArray()){
table[c - 'a']++;
}
for(char c : t.toCharArray()){
table[c - 'a'] --;
if(table[c - 'a'] < 0)
return false;
}
return true;
}
}
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] total = new int[26];
for(char c : magazine.toCharArray()){
total[c-'a']++;
}
for(char c : ransomNote.toCharArray()){
total[c-'a']--;
if(total[c-'a'] < 0)
return false;
}
return true;
}
}
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
for(String str : strs){
int[] counts = new int [26];
for(char c : str.toCharArray()){
counts[c - 'a']++;
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 26; i++){
if(counts[i] != 0){
sb.append((char)('a' + i));
sb.append(counts[i]);
}
}
String key = sb.toString();
List<String> list = map.getOrDefault(key, new ArrayList<>());
list.add(str);
map.put(key,list);
}
return new ArrayList<>(map.values());
}
}
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int sLen = s.length(), pLen = p.length();
if(sLen < pLen)
return new ArrayList<>();
List<Integer> res = new ArrayList<>();
int[] sCount = new int[26];
int[] pCount = new int[26];
for(int i = 0; i < pLen; i++){
sCount[s.charAt(i) - 'a']++;
pCount[p.charAt(i) - 'a']++;
}
if(Arrays.equals(sCount,pCount))
res.add(0);
for(int i = 0; i < sLen - pLen; i++){
sCount[s.charAt(i)-'a']--;
sCount[s.charAt(i + pLen) - 'a']++;
if(Arrays.equals(sCount,pCount))
res.add(i + 1);
}
return res;
}
}
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2= new HashSet<>();
for(int num : nums1){
set1.add(num);
}
for(int num : nums2){
if(set1.contains(num))
set2.add(num);
}
int[] res = new int[set2.size()];
Iterator<Integer> it = set2.iterator();
for(int i = 0; i < res.length; i++){
res[i] =it.next();;
}
return res;
}
}
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer,Integer> record1 = new HashMap<>();
Map<Integer,Integer> record2 = new HashMap<>();
List<Integer> res = new LinkedList<>();
for(int num : nums1){
record1.put(num,record1.getOrDefault(num,0) + 1);
}
for(int num : nums2){
record2.put(num,record2.getOrDefault(num,0) + 1);
}
for(int key : record1.keySet()){
int minCount = 0;
if(record2.get(key) != null)
minCount = Math.min(record1.get(key), record2.get(key));
for(int i = 0; i < minCount; i++)
res.add(key);
}
int[] ans = new int[res.size()];
int index = 0;
for(Integer num : res)
ans[index++]= num;
return ans;
}
}