leetcode刷题-387字符串中的第一个唯一字符

86 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。