leetcode 87. 字符串中的第一个唯一字符

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

题目描述

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

示例:

s = "leetcode"
返回 0

s = "loveleetcode"
返回 2
复制代码

提示:你可以假定该字符串只包含小写字母。

题解

1.使用map存储元素和出现的次数(如果出现多次,直接记为2,减少读取消耗的时间), 然后再次循环字符串,找到第一个次数为1的元素.返回索引位置.

        char[] chars = s.toCharArray();
        HashMap<Character, Integer> characterIntegerHashMap = new HashMap<>();
        for (int i = 0; i <chars.length ; i++) {
            if (characterIntegerHashMap.containsKey(chars[i])) {
                characterIntegerHashMap.put(chars[i],2);
            }
            else {
                characterIntegerHashMap.put(chars[i],1);
            }
        }
        for (int i = 0; i <chars.length ; i++) {
            if (1 == characterIntegerHashMap.get(chars[i])) {
                return i;
            }
        }
        return -1;
复制代码

image.png

  1. 使用数组作为存储比map查找快很多.

将元素存放到26为字母的数组的对应位置,使其+1. 再次循环,根据字符串的元素找到对应位置的次数,==1返回

public static int firstUniqChar(String s) {
        char[] chars = s.toCharArray();
        int[] array = new int[26];
        int temp = chars.length;
        int value = 0;
        for (int i = 0; i <chars.length ; i++) {
            // 用二十六位的数组记录重复的次数,存入次数的位置即相距a的距离
            array[chars[i] - 'a'] ++;
        }
        for (int i = 0; i <chars.length ; i++) {
            // 再次按照字符串的顺序进行遍历,找到第一个次数为1的元素
            if (array[chars[i] - 'a'] == 1) {
                return i;
            }
        }
        return -1;
    }
复制代码

image.png

猜你喜欢

转载自juejin.im/post/7016718165753200670