给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = "leetcode"
返回 0
s = "loveleetcode"
返回 2
思路1:使用hashmap两次遍历
第一次遍历字符集合,如果hashmap中存在对应的key,value+1;如果不存在,value=1
第二次遍历字符集合,根据字符出现的顺序,返回第一个value=1的value
class Solution {
public int firstUniqChar(String s) {
HashMap<Character, Integer> map = new HashMap<>();
char[] chars = s.toCharArray();
for (char ch : chars) {
if (!map.containsKey(ch)){
map.put(ch, 1);
}else {
Integer value = map.get(ch);
map.put(ch, value+1);
}
}
for (int i = 0; i < chars.length; i++) {
if (map.containsKey(chars[i])){
if (map.get(chars[i]) == 1){
return i;
}
}
}
return -1;
}
}
思路2:在思路1使用hashmap两次遍历的基础上进行改进
第一次遍历字符集合,如果hashmap中存在对应的key,value=-1;如果不存在,value=1
第二次遍历hashmap.values,定义一个大值,作为存储最终结果的临时变量,如果value < 临时变量,则更改该临时变量。需要注意的是,如果该字符数组中所有值均为重复的元素,最后临时变量会变成 length-1,需要手动更改为-1
class Solution {
public int firstUniqChar(String s) {
HashMap<Character, Integer> map = new HashMap<>();
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++){
if (map.containsKey(chars[i])){
map.put(chars[i], -1);
}else {
map.put(chars[i], i);
}
}
int n = chars.length;
for (Integer integer : map.values()) {
if (integer != -1 && integer < n){
n = integer;
}
}
if (n == chars.length ){
n = -1;
}
return n;
}
}
思路3:hashmap + 队列的方法
1.定义一个hashmap,key存储字符,value存储索引
2.定义一个linkedlist,类型为pair<Character,Integer>类型,key是字符,value是索引
3.遍历字符集合,如果不存在,就往map和queue中添加元素;如果存在,map中的value改成1,并循环判断queue的最前面的元素中的value是否为-1(通过找queue的key,然后去map中找对应的value,因为map是可以更新同一个key的value的,而queue不行)
4.最后判断queue是否为空,不为空返回最前面元素的value
class Solution {
public int firstUniqChar(String s) {
HashMap<Character, Integer> map = new HashMap<>();
char[] chars = s.toCharArray();
LinkedList<Pair<Character, Integer>> queue = new LinkedList<>();
for (int i = 0; i < chars.length; i++) {
if (!map.containsKey(chars[i])){
map.put(chars[i], i);
queue.offer(new Pair<>(chars[i],i));
}else {
map.put(chars[i], -1);
while (!queue.isEmpty() && map.get(queue.peek().getKey()) == -1){
queue.remove();
}
}
}
if (queue.isEmpty()){
return -1;
}else {
Integer result = queue.getFirst().getValue();
return result;
}
}
}