每日一题:387. 字符串中的第一个唯一字符

59 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

一、题目描述:

387. 字符串中的第一个唯一字符 - 力扣(LeetCode)

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= s.length <= 10^5
  • s 只包含小写字母

二、思路分析:

题干要求找到第一个不重复的字符,那么自然是从前向后遍历
先使用charAt得到数组下标为i的字符,然后使用indexOf从i+1向后找这个字符
若没有返回-1,则表示找到了 因此直接结束这轮循环 i++
如果返回的是-1,则表示该坐标以后没有与之相同的字符,此时需要判断其之前有没有与之相等的字符
因此indexOf(ch,0)==i 就是防止诸如"aabb"这种情况 第二个a之后没有与之相等的字符,此时需要判断从头找的第一个a数组下标是不是也是1
若是 则a在整个字符串中只出现了一次。
整个for走完 没有找到则返回-1.

三、AC 代码:

class Solution {
    public int firstUniqChar(String s) {
        for (int i = 0; i < s.length(); i++) {
            char ch=s.charAt(i);
            if(s.indexOf(ch,i+1)!=-1) {
                continue;
            }
            if(s.indexOf(ch,0)==i)
                return i;
        }
        return -1;
    }
}

范文参考:

字符型和整型的转换,11行代码速度超越99% - 字符串中的第一个唯一字符 - 力扣(LeetCode)

维护一个出现次数为1的hashmap, 遍历string, 找到第一个char - 字符串中的第一个唯一字符 - 力扣(LeetCode)

哈希表直接存放数组下标,不需要记录次数 - 字符串中的第一个唯一字符 - 力扣(LeetCode)