【算法训练】LeetCode#387 字符串中的第一个唯一字符

一、描述

387. 字符串中的第一个唯一字符

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

示例 1:

输入: s = "leetcode"
输出: 0

示例 2:

输入: s = "loveleetcode"
输出: 2

示例 3:

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

二、思路

这道题主要是考察哈希表的操作,创建一个hashmap,key为每个字母,value是一个长度为2的数组,存储位置和出现次数。

(当然,因为这道题划分到了哈希表类型中,所以选择用哈希表做。如果用数组能更快。见v2)

三、解题


public class LeetCode387 {
    public static int firstUniqChar(String s) {
        HashMap<Character,int[]> map = new HashMap<>(); // key为字母,value[0]为其第一次的位置,value[1]为出现次数
        char[] str = s.toCharArray();
        for (int i = 0 ; i < str.length ; i++){
            if (map.containsKey(str[i])){
                int[] arr = map.get(str[i]);
                if (arr[1] > 1){
                    // 如果已经两次以上了,就不浪费时间直接continue
                    continue;
                }
                arr[1] += 1;
                map.put(str[i],arr);
            } else {
                // 未加入过
                map.put(str[i],new int[]{i,1});
            }
        }
        int ans = -1;
        for (int[] arr : map.values()){
            // 直接遍历value
            if (arr[1] == 1){
                if (arr[0] < ans || ans == -1){
                    ans = arr[0];
                }
            }
        }
        return ans;
    }

    // 方法二,用数组
    public static int firstUniqCharV2(String s){
        int[] arr = new int[26];
        int n = s.length();
        char[] chars = s.toCharArray();
        for (int i = 0 ; i < n ; i++){
            arr[chars[i]-'a']++; //记录次数
        }
        for(int i = 0 ; i < n ; i++){
            if (arr[chars[i]-'a'] == 1){
                return i;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        String str = "leetcode";
        System.out.println(firstUniqChar(str));
    }
}


posted @ 2023-02-07 16:02  小拳头呀  阅读(11)  评论(0编辑  收藏  举报