From 6e135dd0eb1c358058f7a551aefbdf95c5278898 Mon Sep 17 00:00:00 2001 From: itayventura Date: Thu, 14 Jan 2021 19:13:58 +0200 Subject: [PATCH 1/3] reducing complexity to linear complixity --- strings/CheckAnagrams.java | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/strings/CheckAnagrams.java b/strings/CheckAnagrams.java index 20ab715acede..679257d56171 100644 --- a/strings/CheckAnagrams.java +++ b/strings/CheckAnagrams.java @@ -1,6 +1,7 @@ package strings; -import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; /** * Two strings are anagrams if they are made of the same letters arranged differently (ignoring the @@ -21,12 +22,33 @@ public static void main(String[] args) { * @return {@code true} if two string are anagrams, otherwise {@code false} */ public static boolean isAnagrams(String s1, String s2) { + int l1 = s1.length(); + int l2 = s2.length(); s1 = s1.toLowerCase(); s2 = s2.toLowerCase(); - char[] values1 = s1.toCharArray(); - char[] values2 = s2.toCharArray(); - Arrays.sort(values1); - Arrays.sort(values2); - return new String(values1).equals(new String(values2)); + Map charAppearances = new HashMap<>(); + + for (int i = 0; i < l1; i++) { + char c = s1.charAt(i); + int numOfAppearances = charAppearances.containsKey(c) ? charAppearances.get(c) : 0; + charAppearances.put(c, numOfAppearances + 1); + } + + for(int i = 0; i < l2; i++){ + char c = s2.charAt(i); + if (!charAppearances.containsKey(c)){ + return false; + } else{ + charAppearances.put(c, charAppearances.get(c)-1); + } + } + + for (int cnt: charAppearances.values()){ + if (cnt != 0){ + return false; + } + } + System.out.println(true); + return true; } } From d3827aa0a77d13e27baae2d9858e9ad013311b75 Mon Sep 17 00:00:00 2001 From: itayventura Date: Thu, 14 Jan 2021 20:08:06 +0200 Subject: [PATCH 2/3] reducing complexity to linear --- strings/CheckAnagrams.java | 1 - 1 file changed, 1 deletion(-) diff --git a/strings/CheckAnagrams.java b/strings/CheckAnagrams.java index 679257d56171..c980115b47b9 100644 --- a/strings/CheckAnagrams.java +++ b/strings/CheckAnagrams.java @@ -48,7 +48,6 @@ public static boolean isAnagrams(String s1, String s2) { return false; } } - System.out.println(true); return true; } } From 2ed7dd2ab96169d24a7b8f677fba4e5c529687c2 Mon Sep 17 00:00:00 2001 From: Yang Libin Date: Sun, 21 Feb 2021 09:01:25 +0800 Subject: [PATCH 3/3] update CheckAnagrams algo --- strings/CheckAnagrams.java | 73 +++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/strings/CheckAnagrams.java b/strings/CheckAnagrams.java index c980115b47b9..d1bd88662c5d 100644 --- a/strings/CheckAnagrams.java +++ b/strings/CheckAnagrams.java @@ -8,46 +8,45 @@ * case). */ public class CheckAnagrams { - public static void main(String[] args) { - assert isAnagrams("Silent", "Listen"); - assert isAnagrams("This is a string", "Is this a string"); - assert !isAnagrams("There", "Their"); - } + public static void main(String[] args) { + assert isAnagrams("Silent", "Listen"); + assert isAnagrams("This is a string", "Is this a string"); + assert !isAnagrams("There", "Their"); + } - /** - * Check if two strings are anagrams or not - * - * @param s1 the first string - * @param s2 the second string - * @return {@code true} if two string are anagrams, otherwise {@code false} - */ - public static boolean isAnagrams(String s1, String s2) { - int l1 = s1.length(); - int l2 = s2.length(); - s1 = s1.toLowerCase(); - s2 = s2.toLowerCase(); - Map charAppearances = new HashMap<>(); + /** + * Check if two strings are anagrams or not + * + * @param s1 the first string + * @param s2 the second string + * @return {@code true} if two string are anagrams, otherwise {@code false} + */ + public static boolean isAnagrams(String s1, String s2) { + int l1 = s1.length(); + int l2 = s2.length(); + s1 = s1.toLowerCase(); + s2 = s2.toLowerCase(); + Map charAppearances = new HashMap<>(); - for (int i = 0; i < l1; i++) { - char c = s1.charAt(i); - int numOfAppearances = charAppearances.containsKey(c) ? charAppearances.get(c) : 0; - charAppearances.put(c, numOfAppearances + 1); - } + for (int i = 0; i < l1; i++) { + char c = s1.charAt(i); + int numOfAppearances = charAppearances.getOrDefault(c, 0); + charAppearances.put(c, numOfAppearances + 1); + } - for(int i = 0; i < l2; i++){ - char c = s2.charAt(i); - if (!charAppearances.containsKey(c)){ - return false; - } else{ - charAppearances.put(c, charAppearances.get(c)-1); - } - } + for (int i = 0; i < l2; i++) { + char c = s2.charAt(i); + if (!charAppearances.containsKey(c)) { + return false; + } + charAppearances.put(c, charAppearances.get(c) - 1); + } - for (int cnt: charAppearances.values()){ - if (cnt != 0){ - return false; - } + for (int cnt : charAppearances.values()) { + if (cnt != 0) { + return false; + } + } + return true; } - return true; - } }