387-字符串中的第一个唯一字符
# 题目描述
难度:简单
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = "leetcode" 返回 0
s = "loveleetcode" 返回 2
提示:你可以假定该字符串只包含小写字母。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/first-unique-character-in-a-string 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
# 思路
# 思路一:
这是一道Hash相关的题目。
在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数。
在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回它的索引,否则在遍历结束后返回−1。
# 思路二:
还可以借助String的API——indexOf()和lastIndexOf()方法
左右同时向中间靠,如果出现的位置都是同一个,那么表示只出现一次,则立即返回;否则就下一位。
# 解法
public class 字符串中的第一个唯一字符387 {
public static void main(String[] args) {
String s = "dddccdbba";
int index = firstUniqChar(s);
// int index = firstUniqChar1(s);
System.out.println(index);
}
/**
* 使用HaspMap
* 时间复杂度:O(n)
* @param s
* @return
*/
static int firstUniqChar(String s) {
Map<Character, Integer> frequency = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
//存放字母出现的次数
frequency.put(ch, frequency.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < s.length(); ++i) {
//第一个出现一次的
if (frequency.get(s.charAt(i)) == 1) {
return i;
}
}
return -1;
}
/**
* 奇技淫巧
*
* @param s
* @return
*/
public int firstUniqChar1(String s) {
for (int i = 0; i < s.length(); i++) {
//lastIndexOf 返回指定字符在此字符串中最后一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))) {
return i;
}
}
return -1;
}
}
上次更新: 2026-03-28 17:00:16