在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例 1:
输入:s = "abaccdeff" 输出:'b'
解题思路
- 先遍历一边s,统计各字符出现的次数
- 找出第一个出现次数为1的字符
这里很明显是一个Key-Value关系,故有以下几种思路
- 可以用HashMap来记录字符和出现的次数是否为1次,再遍历一边s,找到第一次出现次数是1的字符
- 方法1的缺点是,在最差的情况下,需要完整遍历两遍s,为此可以使用LinkedHashMap来记录字符出现的顺序关系,则第二遍遍历最多不会超过26次
- 题目中还有一个限定条件就是s只包含小写字母,很明显,基于这个条件可以采用数组的方式来解决
算法流程
数组实现
- 初始化:声明一个容量为26的数组
- 遍历:遍历s,直接将字符作为索引值,在其对应的索引位置+1
- **2次遍历:**遍历s,返回第一个值为1的索引值
代码
class Solution {
public char firstUniqChar(String s) {
int[] res = new int[26];
char[] chars = s.toCharArray();
for (char c : chars) {
res[c - 'a']++;
}
for (char c : chars) {
if (res[c - 'a'] == 1) {
return c;
}
}
return ' ';
}
}