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 写的很巧妙运用了代码优化技巧简洁了很多,官方的题解有点绕,解法步骤多了一些