publicbooleanisAnagram(String s, String t){ if (s.length() != t.length()) { returnfalse; } // 数组就是简单的哈希表,只不过数组的大小是固定的。又因为题中表示s和t仅包含小写字母,所以限定数组长度为26即可 int[] record = newint[26]; for (int i = 0; i < s.length(); i++) { // 求出字符的相对值作为索引 int index = s.charAt(i) - 'a'; // 出现次数加一 record[index]++; } for (int i = 0; i < t.length(); i++) { int index = t.charAt(i) - 'a'; record[index]--; } for (int i : record) { if (i != 0) { returnfalse; } } returntrue; }
publicbooleancanConstruct(String ransomNote, String magazine){ if (magazine.length() < ransomNote.length()) { returnfalse; } // 先记录目标字符串中字符出现次数 int[] record = newint[26]; for (int i = 0; i < ransomNote.length(); i++) { int index = ransomNote.charAt(i) - 'a'; record[index]++; } for (int i = 0; i < magazine.length(); i++) { int index = magazine.charAt(i) - 'a'; record[index]--; } for (int i : record) { if (i > 0) { returnfalse; } } returntrue; }
public List<Integer> findAnagrams(String s, String p){ List<Integer> result = new ArrayList<>(); int right = p.length(); for (int left = 0; left <= s.length() - p.length(); left++) { if (isEquals(s.substring(left, right), p)) { result.add(left); } right++; } return result; }
publicbooleanisEquals(String input, String target){ int[] record = newint[26]; for (int i = 0; i < input.length(); i++) { record[input.charAt(i) - 'a']++; } for (int i = 0; i < target.length(); i++) { if (--record[target.charAt(i) - 'a'] < 0) { returnfalse; } } returntrue; }
public List<Integer> findAnagrams(String s, String p){ List<Integer> result = new ArrayList<>(); int[] c1 = newint[26], c2 = newint[26]; for (int i = 0; i < p.length(); i++) { c2[p.charAt(i) - 'a']++; } for (int l = 0, r = 0; r < s.length(); r++) { c1[s.charAt(r) - 'a']++; // 移动窗口 if (r - l + 1 > p.length()) { c1[s.charAt(l++) - 'a']--; } if (isEquals(c1, c2)) { result.add(l); } } return result; }
publicbooleanisEquals(int[] c1, int[] c2){ for (int i = 0; i < 26; i++) { if (c1[i] != c2[i]) { returnfalse; } } returntrue; }
两个数组的交集
相关题目:
349.两个数组的交集
350.两个数组的交集II
如果题目中没有给出了限定条件,哈希表的大小无法确定或者比较大,并且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费,此时就要考虑使用 Set 来处理了。在 Java 中,几个常用的 Set 的底层都是 Map 实现的,如下:
1 2 3 4 5 6 7
publicTreeSet(){ this(new TreeMap<E,Object>()); }
publicHashSet(){ map = new HashMap<>(); }
**[349.两个数组的交集]**,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
publicint[] intersection(int[] nums1, int[] nums2) { Set<Integer> set = new HashSet<>(); Set<Integer> result = new HashSet<>(); for (int num : nums1) { set.add(num); } for (int num : nums2) { if (set.contains(num)) { result.add(num); } } return result.stream().mapToInt(x -> x).toArray(); }
**[350.两个数组的交集II]**,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicint[] intersect(int[] nums1, int[] nums2) { List<Integer> result = new ArrayList<>(); Map<Integer, Integer> map = new HashMap<>(); // 统计nums1中元素出现次数 for (int num : nums1) { map.put(num, map.getOrDefault(num, 0) + 1); } // 统计nums2中元素出现次数 for (int num : nums2) { Integer value = map.getOrDefault(num, 0); if (value != 0) { map.put(num, value - 1); result.add(num); } } return result.stream().mapToInt(x -> x).toArray(); }