持续创作,加速成长!这是我参与「掘金日新计划 · 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)