本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.题目描述
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 1:
输入: s = "leetcode"
输出: 0
示例 2:
输入: s = "loveleetcode"
输出: 2
示例 3:
输入: s = "aabb"
输出: -1
提示:
1 <= s.length <= 105s 只包含小写字母
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/fi…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
2.1 一维数组
2.1.1 思路
这个思路是没看官方题解之前自己写的,看完官方题解之后觉得这个更简洁一些,就不想写官方题解了,反如果想练哈希可以试一下用哈希解。
本来看到唯一这个词,第一反应是用哈希表去存,但是后面看到条件是全部小写字母,就觉得没必要用哈希,直接用数组去就够了。
大致的思路就是字母只有26个,所以通过数组记录每个字母出现的次数,之后再按顺序遍历一次,第一次出现一次的数组那就是第一个唯一字母了。真的比官方题解简单很多。代码框架如下:
- 首先新建26位的数组用来存每个字母出现的次数(java数组默认初始化为
0)。 - 然后遍历一遍字符串,计算每个字母出现的次数
- 最后再遍历一遍字符串,如果该字母只出现一次,那么就直接返回;如果遍历完整个字符串都没有返回,说明所有字母都是重复的,就返回
-1。
2.1.2 Java代码
class Solution {
public int firstUniqChar(String s) {
int n = s.length();
int []c = new int[26];
for(int i = 0;i<n;i++){
int temp = s.charAt(i) - 'a';
c[temp]++;
}
for(int i=0;i<n;i++){
int temp = s.charAt(i) - 'a';
if(c[temp] == 1){
return i;
}
}
return -1;
}
}