第一个只出现一次的字符(Python and C++解法)

题目:

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

示例:

s = "abaccdeff"
返回 "b"

s = ""
返回 " "

限制:

0 <= s 的长度 <= 50000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof

思路:

  在C++解法中,使用unordered_map统计字符出现的次数。需要注意:由于unordered_map的底层是哈希表,元素的顺序是打乱的,因此不能使用iterator找第一个元素。

  在Python解法中,由于给定字符串中只包含小写字母,而小写字母只有26个,因此可以定义一个大小为26的整数数组来保存字符串中出现的各个小写字母的个数,最后再遍历一遍给定字符串找到第一个出现一次的字符并返回,以数组映射的方法实现哈希表。需要注意:在计算数组下标时,Python不允许两个str直接相减,需要使用python的ord()函数,其返回值是字符对应的ascii码,可以通过该方法来实现两个字符之间的减法运算。

Python解法:

 1 class Solution:
 2     def firstUniqChar(self, s: str) -> str:
 3         res = ' '
 4         charArray = [0] * 26
 5         for i in range(len(s)):  # 'a'的下标为0,'b'的下标为1......
 6             charToNum = ord(s[i]) - ord('a')  # 字符间的ASCII码值相减
 7             charArray[charToNum] += 1
 8         
 9         for i in range(len(s)):  # 从数组中查找符合次数要求的字符
10             charToNum = ord(s[i]) - ord('a')
11             if charArray[charToNum] == 1:
12                 res = s[i]
13                 break
14         return res

C++解法:

 1 class Solution {
 2 public:
 3     char firstUniqChar(string s) {
 4         char res = ' ';  // 如果字符串长度为0,直接返回
 5         unordered_map<char, int> countChar;
 6         for(int i = 0; i < s.size(); i++)  // 往哈希表中添加元素并计数
 7             countChar[s[i]] += 1;
 8         for(int i = 0; i < s.size(); i++)  // 找符合要求的字符
 9             if(countChar[s[i]] == 1) {
10                  res = s[i];
11                  break;
12             }  
13         return res;
14     }
15 };
posted @ 2020-07-16 16:31  孔子?孟子?小柱子!  阅读(574)  评论(0编辑  收藏  举报