Problem Statement
Given a string S of lowercase English characters ‘a’ – ‘z’. The task is to sort the string.
Examples:
- Input: S = “dceabb”
- Output: “abbcde”
- Input: S = “eeetag”
- Output: “aeeegt”
Approach 1: Using inbuilt sort
The most basic approach to solve this problem is to simply use the inbuilt sorting algorithms of the respective languages.
C++ Code Implementation
void sortString(string &str){
sort(str.begin(), str.end());
cout << str;
}
Java Code Implementation
static void sortString(String str) {
char []arr = str.toCharArray();
Arrays.sort(arr);
System.out.print(String.valueOf(arr));
}
Python Code Implementation
def sortString(str) :
str = ''.join(sorted(str))
print(str)
- Time Complexity: O(NlogN), where N is the length of the string.
- Space Complexity: O(1) since no extra space is used.
Approach 2: Hashing
A quick observation is that the string will contain the utmost 26 unique characters. Therefore, the idea is to count the frequency of each character using a map or similar data structure. Each index of the map will represent the characters from ‘a’ – ‘z’. Therefore for each index, we can print the total number of times the given character is present.
Algorithm
- Initialise a frequency array of size 26.
- Iterate through the string and count the frequency of each character.
- Run a loop from i = 0 till 26 and for each i, print the corresponding character freq[i] times.
C++ Code Implementation
const int MAX_CHAR = 26;
void sortString(string & str) {
int charCount[MAX_CHAR] = {
0
};
for (int i = 0; i < str.length(); i++)
charCount[str[i] - 'a']++;
for (int i = 0; i < MAX_CHAR; i++)
for (int j = 0; j < charCount[i]; j++)
cout << (char)('a' + i);
}
Java Code Implementation
public class SortString {
static final int MAX_CHAR = 26;
static void sortString(String str) {
int letters[] = new int[MAX_CHAR];
for (char x: str.toCharArray()) {
letters[x - 'a']++;
}
for (int i = 0; i < MAX_CHAR; i++) {
for (int j = 0; j < letters[i]; j++) {
System.out.print((char)(i + 'a'));
}
}
}
}
Python Code Implementation
MAX_CHAR = 26
def sortString(str):
charCount = [0 for i in range(MAX_CHAR)]
for i in range(0, len(str), 1):
charCount[ord(str[i]) - ord("a")] += 1
for i in range(0, MAX_CHAR, 1):
for j in range(0, charCount[i], 1):
print(chr(ord("a") + i), end="")
- Time Complexity: O(N * 26), where N is the length of the string.
- Space Complexity: O(1) since constant space of size 26 is used.
Practice Question –
FAQs
Q.1: How to count the frequency of characters of a string?
Ans. The frequency of characters can be counted using a hashmap. Iterate through the string and for each character S[i], perform freq[S[i]]++
Q.2: What is the most efficient approach to solving this problem?
Ans: The hashing technique is the most efficient approach to solving the problem. The time complexity is O(N * 26) and the space complexity is O(1).
