Difficulty | Source | Tags | ||
---|---|---|---|---|
Easy |
160 Days of Problem Solving |
|
The problem can be found at the following link: Problem Link
Given a string s
consisting of lowercase Latin letters, return the first non-repeating character in s
. If there is no non-repeating character, return '$'
.
Note: When you return '$'
, the driver code will output -1
.
Input:
s = "geeksforgeeks"
Output:
'f'
Explanation:
In the given string, 'f'
is the first character in the string which does not repeat.
Input:
s = "racecar"
Output:
'e'
Explanation:
In the given string, 'e'
is the only character in the string which does not repeat.
Input:
s = "aabbccc"
Output:
-1
Explanation:
All the characters in the given string are repeating.
$1 <= s.size() <= 10^5$
-
Frequency Array Method:
- Since the input consists only of lowercase Latin letters, a frequency array of size
26
is sufficient to count occurrences of each character. - Traverse the string once to update the frequency of each character in the array.
- Traverse the string a second time to identify the first character with a frequency of
1
.
- Since the input consists only of lowercase Latin letters, a frequency array of size
-
Steps:
- Initialize a frequency array
freq[26]
and set all elements to0
. - For each character in the string, increment its corresponding frequency in the array.
- Iterate through the string again, checking for the first character with a frequency of
1
. - If no such character exists, return
'$'
.
- Initialize a frequency array
- Expected Time Complexity: O(n), where
n
is the size of the string. The algorithm requires two linear passes through the string. - Expected Auxiliary Space Complexity: O(1), as the frequency array uses a fixed amount of additional space (
26
elements).
char nonRepeatingChar(char s[]) {
int freq[26] = {0};
for (int i = 0; s[i] != '\0'; i++) {
freq[s[i] - 'a']++;
}
for (int i = 0; s[i] != '\0'; i++) {
if (freq[s[i] - 'a'] == 1) {
return s[i];
}
}
return '$';
}
class Solution {
public:
char nonRepeatingChar(string &s) {
int freq[26] = {0};
for (char c : s) {
freq[c - 'a']++;
}
for (char c : s) {
if (freq[c - 'a'] == 1) {
return c;
}
}
return '$';
}
};
class Solution {
public:
char nonRepeatingChar(string &s) {
unordered_map<char, int> freq;
for (char c : s) {
freq[c]++;
}
for (char c : s) {
if (freq[c] == 1) {
return c;
}
}
return '$';
}
};
class Solution {
static char nonRepeatingChar(String s) {
int[] freq = new int[26];
for (char c : s.toCharArray()) {
freq[c - 'a']++;
}
for (char c : s.toCharArray()) {
if (freq[c - 'a'] == 1) {
return c;
}
}
return '$';
}
}
class Solution:
def nonRepeatingChar(self, s):
freq = [0] * 26
for c in s:
freq[ord(c) - ord('a')] += 1
for c in s:
if freq[ord(c) - ord('a')] == 1:
return c
return '$'
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: Any Questions. Let’s make this learning journey more collaborative!
⭐ If you find this helpful, please give this repository a star! ⭐