leetcode初级算法题解JavaScript - 387.字符串中的第一个唯一字符

141 阅读2分钟

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

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

示例 1:

输入: s = "leetcode"
输出: 0

示例 2:

输入: s = "loveleetcode"
输出: 2

示例 3:

输入: s = "aabb"
输出: -1

提示:

  • 1 <= s.length <= 105
  • s 只包含小写字母

题解1:双层循环遍历

  • 外层循环:遍历字符串,对当前元素s[i]查找字符串中是否存在相同元素,flag用来标识元素是否唯一
  • 内层循环:从头遍历字符串s,如果存在元素s[j] == s[i] (注意排除i == j的情况)flag设为false
  • 当内层循环结束时,如果flagtrue即表示当前元素为唯一字符,i就是第一个唯一字符的下标 return i
  • 外层遍历结束函数都没return,则表示没有找到唯一元素,返回 -1
/** 
 * @param {string} s 
 * @return {number} 
*/ 
var firstUniqChar = function(s) { 
   for(let i = 0; i < s.length; i++) { 
     let flag = true
     for(let j = 0; j < s.length; j ++) { 
       if(s[i] == s[j] && i != j) { 
           flag = false 
           break 
        } 
      } 
      if(flag) { 
        return i 
      } 
  } 
  return -1 
};

1b95f41e7f049747b7f47306799e3ff.png

题解2: 哈希表统计字符出现次数 + 遍历字符串

  • 哈希表map统计元素出现次数,键key表示字符,value表示字符出现次数
  • 遍历字符串,如果当前元素出现次数为1,返回其下标;遍历结束没找到出现次数为1的字符,则返回 -1
/**
 * @param {string} s
 * @return {number}
 */
var firstUniqChar = function(s) {
    let map = new Map()
    let count = 0
    for(let i = 0; i < s.length; i++) {
        if(map.has(s[i])){
            count = map.get(s[i])
            map.set(s[i],count + 1)
        } else {
            map.set(s[i], 1)
        }
    }
    for(let i = 0; i < s.length; i++) {
        if(map.get(s[i]) == 1) {
            return i
        }
     }
     return -1
};

15367d38465653d66465255dfaf2fb0.png

题解3: 哈希表存储索引 + 遍历哈希表

  • 遍历字符串,定义哈希表map存储字符索引或标识:如果字符在当前哈希表不存在,键key表示字符,值value表示字符的下标;如果当前字符已经在map中存在即表示不是唯一字符,用-1标识赋值给value
  • 遍历哈希表map,如果value不等于-1,即是唯一字符返回其value;否则表示不存在唯一字符,返回-1;
/**
 * @param {string} s
 * @return {number}
 */
var firstUniqChar = function(s) {
    let map = new Map()
    for(let i = 0; i < s.length; i++) {
        if(map.has(s[i])){
            map.set(s[i],-1)
        } else {
            map.set(s[i], i)
        }
    }
    for (let value of map.values()) {
        if(value != -1) {
            return value
        }
    }
     return -1
};

image.png