本问题对应的 leetcode 原文链接:剑指 Offer 50. 第一个只出现一次的字符

问题描述

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例1 :

输入:s = "abaccdeff"
输出:'b'

示例 2:

输入:s = "" 
输出:' '

限制:

0 <= s 的长度 <= 50000

解题思路

视频讲解直达: 本题视频讲解

代码实现

class Solution {
    public char firstUniqChar(String s) {
        if(s == null || s.length() <= 0){
            return ' ';
        }
//一个字母出现的次数大于 1 次就不符合要求了,这个时候使用 Fasle 标记状态相对于 Integer 的不断递增更合理,也更省空间。布尔值可以用来判断,可以简化代码逻辑。
        Map<Character, Boolean> map = new LinkedHashMap<>();
        for(int i = 0; i < s.length(); i++){
            map.put(s.charAt(i), !map.containsKey(s.charAt(i)));
        }

        for(Map.Entry<Character, Boolean> m : map.entrySet()){
            if(m.getValue()){
                return m.getKey();
            }
        }

        return ' ';
    }
}

Python

from collections import OrderedDict

class Solution(object):
    def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: str
        """
        if not s:
            return ' '

        map = OrderedDict()
        for c in s:
            map[c] = c in map

        for k, v in map.items():
            if not v:
                return k

        return ' '

C++

class Solution {
public:
    char firstUniqChar(string s) {
        if (s.empty()) {
            return ' ';
        }

        map<char, int> mp;
        for (int i = 0; i < s.size(); ++i) {
            mp[s[i]] = !mp.count(s[i]);
        }

        for (auto ch : s) {
            if (mp[ch]) {
                return ch;
            }
        }

        return ' ';
    }
};

Go

func firstUniqChar(s string) byte {
    if len(s) == 0 {
        return ' '
    }

    m := make(map[byte]int)
    for i := range s {
        c := s[i]
        if _, ok := m[c]; ok {
            m[c] = -1
        } else {
            m[c] = i
        }
    }

    minIndex := len(s)
    for _, v := range m {
        if v >= 0 && v < minIndex {
            minIndex = v
        }
    }

    if minIndex < len(s) {
        return s[minIndex]
    } else {
        return ' '
    }
}

JS

/**
 * @param {string} s
 * @return {character}
 */
var firstUniqChar = function(s) {
    if (s == null || s.length <= 0) {
        return ' ';
    }
    // 一个字母出现的次数大于 1 次就不符合要求了,这个时候使用 Fasle 标记状态相对于 Integer 的不断递增更合理,也更省空间。
    // 布尔值可以用来判断,可以简化代码逻辑。
    let map = new Map();
    for (let i = 0; i < s.length; i++) {
        map.set(s.charAt(i), !map.has(s.charAt(i)));
    }

    for (let [key, value] of map.entries()) {
        if (value) {
            return key;
        }
    }

    return ' ';
};

发表回复

后才能评论