小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
leetcode387-字符串中的第一个唯一字符
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = "leetcode" 返回 0
s = "loveleetcode" 返回 2
解题思路分析
解法1
想要解决第一个唯一字符,很容易联想到通过遍历查找所有字符并进行记录。而由于需要记录数据的重复性,本解法则选择了通过两个map进行记录。其中一个map用于存放所有出现过的字符,另一个map则用于记录仅仅出现一次的字符。通过遍历,对每个元素进行判断。如果出现过元素的map不包含,则将元素加入到两个map中。而如果元素已经出现过,则将记录唯一出现的map中的该元素进行移除处理。经过一轮遍历,唯一map中的元素则为所有只出现一次的元素。此时对此map进行第二次遍历,遍历时初始值为-1.每个元素的下角标要进行以下大小比较,由此得到字符串中的第一个唯一字符。 代码如下:
public int firstUniqChar(String s) {
HashMap<Character,Integer> map = new HashMap<>();
HashMap<Character,Integer> maped = new HashMap<>();
char[] array = s.toCharArray();
int result = -1;
for(int i = 0;i < array.length;i++){
if(maped.containsKey(array[i])){
map.remove(array[i]);
}else{
map.put(array[i],i);
maped.put(array[i],i);
}
}
for (int i = 0; i < map.values().toArray().length; i++) {
if(i == 0){
result = (int) map.values().toArray()[0];
}else{
if(result > (int) map.values().toArray()[i]){
result = (int) map.values().toArray()[i];
}
}
}
return result;
}
复杂度分析
- 时间复杂度 o(n)
- 空间复杂度 o(n)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。