From f930c3d33d4fa85025588fdd885c7457f083c26d Mon Sep 17 00:00:00 2001 From: Rohit Date: Tue, 21 Apr 2026 07:36:50 +0530 Subject: [PATCH 1/6] Sort Character by Frequency --- .../strings/SortCharacterByFrequency.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java diff --git a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java new file mode 100644 index 000000000000..7f1194ef0a32 --- /dev/null +++ b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java @@ -0,0 +1,66 @@ +import java.util.*; + +// Problem: Sort Characters By Frequency +// Pattern: HashMap + Priority Queue (Heap) +// Difficulty: Medium + +/* + Approach: + 1. Count frequency of each character using a HashMap. + 2. Store characters in a max-heap (PriorityQueue) based on frequency. + 3. If frequencies are same, sort by character (lexicographically). + 4. Extract from heap and append characters 'frequency' times. + + Time Complexity: O(n log n) + Space Complexity: O(n) +*/ + +class Solution { + public String frequencySort(String s) { + + // Step 1: Count frequency of each character + Map map = new HashMap<>(); + + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + + // Increment frequency using getOrDefault + map.put(ch, map.getOrDefault(ch, 0) + 1); + } + + // Step 2: Create max-heap based on frequency + PriorityQueue> pq = + new PriorityQueue<>((a, b) -> { + + // Higher frequency comes first + int diff = b.getValue() - a.getValue(); + + // If frequency same, sort by character + if (diff == 0) return a.getKey() - b.getKey(); + + return diff; + }); + + // Add all entries to heap + pq.addAll(map.entrySet()); + + // Step 3: Build result string + StringBuilder sb = new StringBuilder(); + + while (!pq.isEmpty()) { + + Map.Entry entry = pq.poll(); + + char key = entry.getKey(); // character + int freq = entry.getValue(); // frequency + + // Append character 'freq' times + for (int i = 0; i < freq; i++) { + sb.append(key); + } + } + + // Step 4: Return final string + return sb.toString(); + } +} From 495eec51c2a524b0921c948b303efba94e52d20d Mon Sep 17 00:00:00 2001 From: Rohit Date: Tue, 21 Apr 2026 07:41:37 +0530 Subject: [PATCH 2/6] Added Test Cases for SortCharacterByFrequency --- .../strings/SortCharacterByFrequency.java | 1 + .../strings/SortCharacterByFrequencyTest.java | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java diff --git a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java index 7f1194ef0a32..81012568366f 100644 --- a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java +++ b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java @@ -1,3 +1,4 @@ +// Reference: https://leetcode.com/problems/sort-characters-by-frequency/ import java.util.*; // Problem: Sort Characters By Frequency diff --git a/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java b/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java new file mode 100644 index 000000000000..38bfd8246d40 --- /dev/null +++ b/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java @@ -0,0 +1,40 @@ +package com.thealgorithms.strings; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +class SortCharacterByFrequencyTest { + + private final SortCharacterByFrequency solution = new SortCharacterByFrequency(); + + @Test + void testBasicCase() { + String result = solution.frequencySort("tree"); + + // Possible outputs: "eert" or "eetr" + assertTrue(result.equals("eert") || result.equals("eetr")); + } + + @Test + void testSingleCharacter() { + assertEquals("a", solution.frequencySort("a")); + } + + @Test + void testEmptyString() { + assertEquals("", solution.frequencySort("")); + } + + @Test + void testAllSameCharacters() { + assertEquals("aaaa", solution.frequencySort("aaaa")); + } + + @Test + void testMixedCharacters() { + String result = solution.frequencySort("cccaaa"); + + // Possible outputs: "cccaaa" or "aaaccc" + assertTrue(result.equals("cccaaa") || result.equals("aaaccc")); + } +} From 951ac54f85e201e8863bda01627f751e5d5b0efe Mon Sep 17 00:00:00 2001 From: Rohit Date: Tue, 21 Apr 2026 07:44:42 +0530 Subject: [PATCH 3/6] Format SortCharacterByFrequency and tests using clang-format --- .../strings/SortCharacterByFrequency.java | 18 ++++++++---------- .../strings/SortCharacterByFrequencyTest.java | 1 + 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java index 81012568366f..46dc46ba74dd 100644 --- a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java +++ b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java @@ -30,17 +30,15 @@ public String frequencySort(String s) { } // Step 2: Create max-heap based on frequency - PriorityQueue> pq = - new PriorityQueue<>((a, b) -> { + PriorityQueue> pq = new PriorityQueue<>((a, b) -> { + // Higher frequency comes first + int diff = b.getValue() - a.getValue(); - // Higher frequency comes first - int diff = b.getValue() - a.getValue(); + // If frequency same, sort by character + if (diff == 0) return a.getKey() - b.getKey(); - // If frequency same, sort by character - if (diff == 0) return a.getKey() - b.getKey(); - - return diff; - }); + return diff; + }); // Add all entries to heap pq.addAll(map.entrySet()); @@ -52,7 +50,7 @@ public String frequencySort(String s) { Map.Entry entry = pq.poll(); - char key = entry.getKey(); // character + char key = entry.getKey(); // character int freq = entry.getValue(); // frequency // Append character 'freq' times diff --git a/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java b/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java index 38bfd8246d40..e800b98b03bb 100644 --- a/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java +++ b/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java @@ -1,6 +1,7 @@ package com.thealgorithms.strings; import static org.junit.jupiter.api.Assertions.*; + import org.junit.jupiter.api.Test; class SortCharacterByFrequencyTest { From 46bf9e2fc781f9686b045c18abd2e41af53c5204 Mon Sep 17 00:00:00 2001 From: Rohit Date: Tue, 21 Apr 2026 07:56:25 +0530 Subject: [PATCH 4/6] Add SortCharacterByFrequency implementation with unit tests --- .../thealgorithms/strings/SortCharacterByFrequency.java | 4 +++- .../strings/SortCharacterByFrequencyTest.java | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java index 46dc46ba74dd..91d69c994d62 100644 --- a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java +++ b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java @@ -1,6 +1,8 @@ // Reference: https://leetcode.com/problems/sort-characters-by-frequency/ +package com.thealgorithms.strings; import java.util.*; + // Problem: Sort Characters By Frequency // Pattern: HashMap + Priority Queue (Heap) // Difficulty: Medium @@ -16,7 +18,7 @@ Space Complexity: O(n) */ -class Solution { +class SortCharacterByFrequency { public String frequencySort(String s) { // Step 1: Count frequency of each character diff --git a/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java b/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java index e800b98b03bb..f2d033e72010 100644 --- a/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java +++ b/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java @@ -38,4 +38,12 @@ void testMixedCharacters() { // Possible outputs: "cccaaa" or "aaaccc" assertTrue(result.equals("cccaaa") || result.equals("aaaccc")); } + + @Test + void testWithNumbersAndLetters() { + String result = solution.frequencySort("Aabb"); + + // 'b' appears twice → should come first + assertTrue(result.startsWith("bb")); + } } From 732517c403cb26f90c38969c997b301c2da7fa69 Mon Sep 17 00:00:00 2001 From: Rohit Date: Tue, 21 Apr 2026 07:58:48 +0530 Subject: [PATCH 5/6] Add SortCharacterByFrequency implementation with unit tests --- .../java/com/thealgorithms/strings/SortCharacterByFrequency.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java index 91d69c994d62..f3f5424e8104 100644 --- a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java +++ b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java @@ -2,7 +2,6 @@ package com.thealgorithms.strings; import java.util.*; - // Problem: Sort Characters By Frequency // Pattern: HashMap + Priority Queue (Heap) // Difficulty: Medium From 10837e6e1891410d7ebc206b99413e19705d2185 Mon Sep 17 00:00:00 2001 From: Rohit Date: Thu, 23 Apr 2026 20:01:55 +0530 Subject: [PATCH 6/6] Removed WildCard Imports --- .../com/thealgorithms/strings/SortCharacterByFrequency.java | 5 +++-- .../thealgorithms/strings/SortCharacterByFrequencyTest.java | 4 ---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java index f3f5424e8104..f5f1d73616ab 100644 --- a/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java +++ b/src/main/java/com/thealgorithms/strings/SortCharacterByFrequency.java @@ -1,6 +1,5 @@ // Reference: https://leetcode.com/problems/sort-characters-by-frequency/ package com.thealgorithms.strings; -import java.util.*; // Problem: Sort Characters By Frequency // Pattern: HashMap + Priority Queue (Heap) @@ -36,7 +35,9 @@ public String frequencySort(String s) { int diff = b.getValue() - a.getValue(); // If frequency same, sort by character - if (diff == 0) return a.getKey() - b.getKey(); + if (diff == 0) { + return a.getKey() - b.getKey(); + } return diff; }); diff --git a/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java b/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java index f2d033e72010..10111b22204b 100644 --- a/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java +++ b/src/test/java/com/thealgorithms/strings/SortCharacterByFrequencyTest.java @@ -1,9 +1,5 @@ package com.thealgorithms.strings; -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; - class SortCharacterByFrequencyTest { private final SortCharacterByFrequency solution = new SortCharacterByFrequency();