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



相关文章
|
13天前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
49 0
Leetcode第三题(无重复字符的最长子串)
|
13天前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
21 9
|
13天前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
12 0
|
13天前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
25 0
|
13天前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
14 0
|
13天前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
15 0
|
13天前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
12 0
|
2月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
28天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
50 6