LeetCode 387. 字符串中的第一个唯一字符
题目介绍:
给定一个字符串 s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
。
示例1:
输入: s = "lovejuejin" 输出: 0
示例2:
输入: s = "abcabc" 输出: -1
方案一:遍历字符串,indexOf与lastIndexOf进行比对
前置知识:
indexOf(char)
: 在字符串中正序查找
字符char
,如果存在返回
遇到的第一个char
字符所在位置的对应索引index
,否则返回-1
;
lastIndeOf(char)
在字符串中倒序查找
字符char
,如果存在返回
遇到的第一个char
字符所在位置的对应索引index
,否则返回-1
/** * @method firstUniqChar * @description: 获取字符串中的第一个唯一字符 - indexOf、lastIndexOf * @param {string} s 输入字符串 * @return {number} */ function firstUniqChar1(s: string): number { // 获取字符串长度 const len = s.length; // 边界处理 if (len === 0) return -1; // 1. 遍历每一个字符 for (let i = 0; i < len; i++) { // 2. 查询当前字符的索引位置 indexOf正序查询 lastIndexOf倒序查询 // 二者索引位置一致,则说明只有一个,直接返回当前索引即可 if (s.indexOf(s[i]) === s.lastIndexOf(s[i])) { return i; } } // 不符合条件,返回-1 return -1; }
功能验证:
console.log(firstUniqChar1('lovejuejin')); // 0 console.log(firstUniqChar1('abcabc')); // -1
方案二:Map存储,两次for循环
/** * @method firstUniqChar2 * @description: 获取字符串中的第一个唯一字符 - map存储,两次循环 * @param {string} s * @return {number} */ function firstUniqChar2(s: string): number { // 获取字符串长度 const len = s.length; // 边界处理 if (len === 0) return -1; const map = new Map(); // 1. 遍历每一个字符 for (let i = 0; i < len; i++) { // 2. 判断Map中是否已经有该字符了 if (map.has(s[i])) { // 设置成特殊的-1,表示已经重复了 map.set(s[i], -1); } else { map.set(s[i], i); } } // 3. 判断map中是否有值 // 定义 let indexMin = len; // @ts-ignore for (let i of map.values()) { // 筛除-1的选项 if (i !== -1 && i < indexMin) { indexMin = i; } } return indexMin === len ? -1 : indexMin; }
功能验证:
console.log(firstUniqChar2('lovejuejin')); // 0 console.log(firstUniqChar2('abcabc')); // -1