Skip to content

387. 字符串中的第一个唯一字符

解题过程

INFO

题目链接 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1

javascript
/**
 * @link https://leetcode.cn/problems/first-unique-character-in-a-string/
 * @title 387. 字符串中的第一个唯一字符
 * @description 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
 * @param {string} s
 * @return {number}
 */
// 解法一
// 思路:使用Map存储遍历字符串统计字符出现的次数,然后遍历Map变量找到第一个统计字符为1的字符即可
var firstUniqChar = function (s) {
  let target = -1
  const countMap = new Map()

  for (let i = 0; i < s.length; i++) {
    if (countMap.has(s[i])) {
      countMap.set(s[i], countMap.get(s[i]) + 1)
    } else {
      countMap.set(s[i], 1)
    }
  }

  for (const [key, value] of countMap) {
    if (value === 1) {
      target = s.indexOf(key)
      break
    }
  }

  return target
}

// 解法二
// 思路:遍历字符串统计遍历到的当前字符在字符串后续出现的索引是否为-1来判断即可
var firstUniqChar = function (s) {
  let target = -1
  const arr = []

  for (let i = 0; i < s.length; i++) {
    const lastIndex = s.indexOf(s[i], i + 1)
    if (!arr.includes(s[i]) && lastIndex === -1) {
      target = i
      break
    } else {
      arr.push(s[i])
    }
  }

  return target
}

// 解法三
// 思路:来着评论区的题解:只运用到字符串 API indexOf 和 lastIndexOf 来做,代码极简
var firstUniqChar = function (s) {
  for (let i in s) {
    if (s.indexOf(s[i]) === s.lastIndexOf(s[i])) {
      return i
    }
  }

  return -1
}

const result = firstUniqChar('leetcode') // 0
// const result = firstUniqChar('loveleetcode') // 2
// const result = firstUniqChar('aabb') // -1
console.log(result)

解题感受

自己写了两种解题方案,看到评论区有个用 js 写的很巧妙运用了代码优化技巧简洁了很多,官方的题解有点绕,解法步骤多了一些

优质题解