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

简介: 算法,从承认自己是一个菜鸟开始!话不多说,让我们继续我们的算法之旅。

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



相关文章
|
2天前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
35 6
|
2天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
2天前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
11 0
|
2天前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
24 1
|
2天前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
2天前
|
机器学习/深度学习 索引
【力扣】387. 字符串中的第一个唯一字符
【力扣】387. 字符串中的第一个唯一字符
|
2天前
|
网络协议
《 LeetCode 热题 HOT 100》——无重复字符的最长子串
《 LeetCode 热题 HOT 100》——无重复字符的最长子串
|
2天前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
17 0
|
2天前
|
机器学习/深度学习 NoSQL Shell
力扣刷题-翻转字符串
力扣刷题-翻转字符串
12 1