标题 | 387. 字符串中的第一个唯一字符 |
难度 | 简单 |
天数 | 第6天,第1/3题 |
数据结构 | 字符串 |
给定一个字符串
s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回-1
。
示例 1:
输入: s = “leetcode”
输出: 0
示例 2:
输入: s = “loveleetcode”
输出: 2
示例 3:
输入: s = “aabb”
输出: -1
提示:
1 <= s.length <= 105
s
只包含小写字母
以上内容来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
- 字母有26个,那么创建一个大小是26的数组
int[] dp = new int[26];
- 遍历字符串,取出字符,然后将字符转换成数字0-25,用数字做索引,给数组赋值
for(int i = 0 ; i < m ;i++){
int item = s.charAt(i)-'a';
dp[item]++;
}
- 正序遍历字符串,查询字母数量,如果==1,代表当前位置是第一个唯一字符
for(int i = 0; i < m; i++){
int item = s.charAt(i)-'a';
if(dp[item] == 1){
return i;
}
}
完整代码
class Solution {
//数据结构 第 6 天 1/3字符串
public int firstUniqChar(String s) {
int m = s.length();
int[] dp = new int[26];
for(int i = 0 ; i < m ;i++){
int item = s.charAt(i)-'a';
dp[item]++;
}
for(int i = 0; i < m; i++){
int item = s.charAt(i)-'a';
if(dp[item] == 1){
return i;
}
}
return -1;
}
}
最开始写的版本
class Solution {
//数据结构 第 6 天 1/3字符串
public int firstUniqChar(String s) {
int m = s.length();
if(m == 1){
return 0;
}
for(int i = 0 ;i < m;i++){
for(int j = m - 1; j >= 0;j--){
if(i != j && s.charAt(i) == s.charAt(j)){
break;
}
//如果遍历到当前i字母下一位,并且不相等,那么i就是第一个字符
if(j == 0 && (s.charAt(i) != s.charAt(j)|| i == 0)){
return i;
}
}
}
return -1;