LinkedHashMap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public char firstUniqChar(String s) { Map<Character, Boolean> charToUniqMap = new LinkedHashMap<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (!charToUniqMap.containsKey(c)) { charToUniqMap.put(c, Boolean.TRUE); } else { charToUniqMap.put(c, Boolean.FALSE); } }
for (Map.Entry<Character, Boolean> entry : charToUniqMap.entrySet()) { if (entry.getValue()) { return entry.getKey(); } }
return ' '; } }
|
使用 LinkedHashMap 可以避免重复扫描原字符串。
Array
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public char firstUniqChar(String s) { int[] countArray = new int[26]; int[] indexArray = new int[26]; Arrays.fill(indexArray, -1);
for (int i = 0; i < s.length(); i++) { int offset = s.charAt(i) - 'a'; countArray[offset]++; if (indexArray[offset] == -1) { indexArray[offset] = i; } }
int minIndex = Integer.MAX_VALUE; char uniqChar = ' ';
for (int i = 0; i < countArray.length; i++) { if (countArray[i] == 1 && indexArray[i] < minIndex) { minIndex = indexArray[i]; uniqChar = (char) ('a' + i); } }
return uniqChar; } }
|
References
剑指 Offer 50. 第一个只出现一次的字符