刷题笔记-387. 字符串中的第一个唯一字符

129 阅读1分钟

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

一、题目描述:

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

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

 

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

二、思路分析:

首先,我想计算出该字符串中每个字符重复的个数。
其次,我要找出重复次数为1的字符。
因为题目告诉我们全部为小写字母,小写字母共有26个,那如果我们定义一个长度为26的数组,a->z 每个小写单词对应 0->25 ,那么我就很容易知道每个字母重复的次数了。
int only[] = new int[26]
如何判断呢?
我们知道,字符减去字符得整数,那么

for(int i = 0; i < s.length(); i++){
        only[s.charAt(i) - 'a']++;
}

就可以解决这个问题
此时就得到了传进来的字符串中每个字母重复的次数
用同样的for循环,那么遍历这个26位数组的顺序也是一样的\

for(int i = 0; i < s.length(); i++){
    if(only[s.charAt(i) - 'a'] == 1) //判断哪个字符的重复次数为 1
        return i; //返回下标
}

最后,如果没有,就返回 -1

三、AC 代码:

class Solution {
    public int firstUniqChar(String s) {
        int only[] = new int[26];
        for(int i = 0; i < s.length(); i++){
            only[s.charAt(i) - 'a']++;
        }
        for(int i = 0; i < s.length(); i++){
            if(only[s.charAt(i) - 'a'] == 1)
                return i;
        }
        return -1;
    }
}

范文参考:

当字符第一次和最后一次出现的下标一致就是出现一次 - 字符串中的第一个唯一字符 - 力扣(LeetCode)

用一维数组(题目假定该字符串只包含小写字母)代替HashTable的解法! - 字符串中的第一个唯一字符 - 力扣(LeetCode)