原题地址
剑指 Offer 50. 第一个只出现一次的字符
题目描述
题目思路
- 哈希表:由于哈希表存储的是key-value的键值对,因此不妨遍历字符串,将字符放入表中作为key,而value可以考虑使用一个标志位来判断该字符是否重复出现。
- 有序哈希表:相较于哈希表,有序哈希表维护了链表来保证表中元素按插入先后进行排序,因此,可以实现查找“第一个只出现一次”的元素。相较于使用哈希表需要遍历两次字符串,而本方法第二次遍历时,只需遍历表中元素即可(哈希表自带“去重”效果,即表中元素 <= 字符串长度),因此效率较高。
代码实现
哈希表
class Solution {
public char firstUniqChar(String s) {
char[] ca = s.toCharArray();
Map<Character,Boolean> map = new HashMap<Character,Boolean>();
for(char c : ca) {
map.put(c,!map.containsKey(c));
}
for(char c : ca) {
if(map.get(c)) return c;
}
return ' ';
}
}
有序哈希表
class Solution {
public char firstUniqChar(String s) {
Map<Character, Boolean> map= new LinkedHashMap<>();
char[] sc = s.toCharArray();
for(char c : sc)
map.put(c, !map.containsKey(c));
for(Map.Entry<Character, Boolean> m : map.entrySet()){
if(m.getValue()) return m.getKey();
}
return ' ';
}
}