algorithm to find first unrepeated character in a string
April 19, 2013 1 Comment
We can do it in two different ways
- Algorithm with O(2n) time complexity and O(1) space complexity
- Algorithm with O(2n) time complexity and O(n) space complexity
Algorithm with O(2n) time complexity and O(1) space complexity
Here we take a fixed size (256 in which all characters small and caps fall into) integer array and we scan the string two times
- First scan we increment the counter in integer array for every character that appears in string
- In second scan, we look for counter value 1 which gives the first unrepeated character in string
Note: Here space complexity is O(1) because the int array size is always constant irrespective of the string we pass
public static char firtUnrepeatedCharInString(char[] s) { char result = '\0'; int[] counts = new int[256]; for (char c : s) { counts[c]++; } for (int i = 0; i < s.length; i++) { if (counts[s[i]] == 1) { result = s[i]; break; } } return result; }
Algorithm with O(2n) time complexity and O(n) space complexity
Here we take hashmap and we scan the string two times
- First scan we insert every character that appears in string as key and its number of appearances as value in hashmap
- In second, scan we look for key whose value is 1 which gives the first unrepeated character in string
public static char firtUnrepeatedCharInString(char[] s) { char result = '\0'; HashMap<Character, Integer> hm = new HashMap<Character, Integer>(); for (char c : s) { Object o = hm.get(c); if(o == null) { hm.put(c, 1); } else { int ctr = hm.get(c); hm.put(c, ++ctr); } } for (char c : s) { int ctr = hm.get(c); if(ctr == 1) { result = c; break; } } return result; }
For approach 2:
Since the hash map can’t 100% guarantee the order of elements (here the approach is assuming the order of insertion is preserved by HMap), how can we be certain of the “first” un-repeated character ? It may very well be the second or third un-repeated character as well?