题目地址:地址

解题思路

主要是利用哈希表来进行存储的操作。官方题解中,给的方式包括三种:

  1. 用哈希表存储每个字符出现的次数,第二次遍历出现1次的字符,返回当前的索引;
  2. 用哈希表存储索引。如果哈希表中存在该字符,那么该字符的索引设置为-1,如果不存在,那么哈希表将当前的字符作为key,当前的索引作为value来存储;遍历哈希表,当前的值不为-1就返回,如果都是-1,那么直接返回-1
  3. 也可以利用队列的方式,来寻找

    代码

  1. var firstUniqChar2 = function(s) {
  2. const position = new Map();
  3. const n = s.length;
  4. for (let [i, ch] of Array.from(s).entries()) {
  5. if (position.has(ch)) {
  6. position.set(ch, -1);
  7. } else {
  8. position.set(ch, i);
  9. }
  10. }
  11. let first = n;
  12. for (let pos of position.values()) {
  13. if (pos !== -1 && pos < first) {
  14. first = pos;
  15. }
  16. }
  17. if (first === n) {
  18. first = -1;
  19. }
  20. return first;
  21. };
  1. var firstUniqChar = function(s) {
  2. const position = new Map();
  3. const q = [];
  4. const n = s.length;
  5. for (let [i, ch] of Array.from(s).entries()) {
  6. if (!position.has(ch)) {
  7. position.set(ch, i);
  8. q.push([s[i], i]);
  9. } else {
  10. position.set(ch, -1);
  11. while (q.length && position.get(q[0][0]) === -1) {
  12. q.shift();
  13. }
  14. }
  15. }
  16. return q.length ? q[0][1] : -1;
  17. };