387. 字符串中的第一个唯一字符
js
;(function () {
/**
* 387. 字符串中的第一个唯一字符
* 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
*
* 输入: s = "leetcode"
* 输出: 0
*
* 输入: s = "loveleetcode"
* 输出: 2
*
* 输入: s = "aabb"
* 输出: -1
*
*/
function firstUniqChar(s: string): number {
// 方法一: 超出时间限制
// if (s.length === 1) {
// return 0
// }
// let sArr = s.split('');
// let rtnKey = -1;
// // 记录值有重复的字符
// let flags: string[] = [];
// sArr.forEach((x, k) => {
// let afterArr = sArr.slice(k+1)
// if (!afterArr.includes(x) && rtnKey === -1 && !flags.includes(x)) {
// rtnKey = k;
// } else {
// flags.push(x)
// }
// })
// return rtnKey
// 方法二
// if (s.length === 1) {
// return 0
// }
// let rtnKey = -1;
// let set = new Set();
// for (let i = 0; i < s.length; i++) {
// let aferStr = s.slice(i + 1)
// // 没有重复的值
// if (aferStr.indexOf(s[i]) === -1 && !set.has(s[i])) {
// rtnKey = i;
// break;
// } else {
// set.add(s[i])
// }
// }
// return rtnKey
// 方法三:
// 奇技淫巧:遍历字符串如果当前字符的第一个索引和最后一个索引不是同一个则继续遍历,是同一个返回即可。
// if (s.length === 1) {
// return 0
// }
// let rtnKey = -1;
// for (let i = 0; i < s.length; i++) {
// let firstK = s.indexOf(s[i]);
// let lastK = s.lastIndexOf(s[i]);
// if (firstK === lastK) {
// rtnKey = i;
// break;
// }
// }
// return rtnKey
// 方法四:数组计数
let list = new Array(26).fill(null)
for (let i = 0; i < s.length; i++) {
let char = s.charAt(i)
let idx = char.charCodeAt(0) - 97
if (list[idx] == null) {
list[idx] = i
} else {
list[idx] = -1
}
}
list = list.filter((item) => item != null && item != -1)
if (list.length == 0) {
return -1
} else {
return Math.min.apply(null, list)
}
}
let s = 'loveleetcode'
let s2 = 'aabb'
let s3 = 'aadadaad'
let s4 = 'dddccdbba'
console.log(firstUniqChar(s))
console.log(firstUniqChar(s2))
console.log(firstUniqChar(s3))
console.log(firstUniqChar(s4))
})()