4月更文d10n10-leetcode刷题387字符串中的第一个唯一字符

130 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

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

前文

本文为leetcode字符串处理类型题目,主要考察对于字符串中重复内容的查找。题目序号为387,题目链接为https://leetcode-cn.com/problems/first-unique-character-in-a-string/

题目信息

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

 

示例 1:

输入: s = "leetcode" 输出: 0 示例 2:

输入: s = "loveleetcode" 输出: 2 示例 3:

输入: s = "aabb" 输出: -1

解题思路

根据题目信息,首先我们有一个字符串,需要从中找出第一个不重复的字符。很明显,首先我们一定需要对于字符串做一次遍历,并记录每一个字符串出现的次数。而本解法主要采取的思路则是引入map的数据结构进行字符串中每个字符的出现次数。通过一轮遍历后,将所有的字符串都存入到哈希结构之中。而此时再次对于字符串进行遍历,对于每一个出现的字符,都到哈希表中查找字符串中存在的总次数。当找到第一个次数为1时,则直接返回该位置,就是第一个唯一字符所在的位置。如果遍历结束都没找到值为1的字符,则返回-1,认为不存在唯一字符。而哈希的键则采用char转换为字符串类型来操作。以上即为本题目的解法。另外还可以采用队列进行操作。利用队列与哈希的配合,在遍历中直接将出现次数及元素在队列中存储。利用队列先进先出的原则,也可以完成此题目的解答。

解题代码

public int firstUniqChar(String s) {
    Map<String,Integer> map = new HashMap<>();
    for (int i = 0; i < s.length(); i++) {
        String item = String.valueOf(s.charAt(i));
        int cnt = map.getOrDefault(item,0);
        map.put(item,cnt + 1);
    }
    for (int i = 0; i < s.length(); i++) {
        String item = String.valueOf(s.charAt(i));
        if(map.get(item) == 1){
            return i;
        }
    }
    return -1;
}

后记

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