📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 |问题 18(1)

📅  最后修改于: 2023-12-03 14:50:47.716000             🧑  作者: Mango

国际空间研究组织 ISRO CS 2017 问题 18 题解

问题描述

给定一个字符串,包含大小写字母和数字,找到第一个非重复的字符,并返回该字符的下标。如果不存在,则返回 -1。

例如,输入字符串 abca,第一个非重复的字符是 b,它的下标是 1;输入字符串 abbcb,不存在非重复字符,返回 -1。

算法思路

我们可以使用哈希表来记录每个字符出现的次数。首先遍历一遍字符串,通过哈希表记录每个字符出现的次数。然后再遍历一遍字符串,找到第一个出现次数为 1 的字符即可。

时间复杂度为 O(n)。

代码实现

以下是 Python 代码实现:

def first_unique_char(s: str) -> int:
    counter = {}
    for c in s:
        counter[c] = counter.get(c, 0) + 1
    for i, c in enumerate(s):
        if counter[c] == 1:
            return i
    return -1

以下是 Java 代码实现:

public static int firstUniqueChar(String s) {
    Map<Character, Integer> counter = new HashMap<>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        counter.put(c, counter.getOrDefault(c, 0) + 1);
    }
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (counter.get(c) == 1) {
            return i;
        }
    }
    return -1;
}
测试样例

我们可以使用下面的测试样例来测试算法的正确性:

assert first_unique_char("abca") == 1
assert first_unique_char("abbcb") == -1
assert first_unique_char("leetcode") == 0

测试通过后,我们可以提交代码。