387. 字符串中的第一个唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 1:
输入: s = "leetcode"
输出: 0
示例 2:
输入: s = "loveleetcode"
输出: 2
示例 3:
输入: s = "aabb"
输出: -1
提示:
1 <= s.length <= 105s只包含小写字母
题解1:双层循环遍历
- 外层循环:遍历字符串,对当前元素
s[i]查找字符串中是否存在相同元素,flag用来标识元素是否唯一 - 内层循环:从头遍历字符串s,如果存在元素
s[j] == s[i] (注意排除i == j的情况),flag设为false - 当内层循环结束时,如果
flag为true即表示当前元素为唯一字符,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
};
题解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
};
题解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
};