题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
基本思路
为了确定每个字符出现的次数和位置,我们是肯定需要遍历一次字符串的。现在的问题就是如何实现快速更新次数和位置数据。可以想到用HashMap的方式来保存数据,这样我们就可以在 O(1) 时间内更新了。
由于全部是由字母组成的,那么我们可以直接通过数组来存储,效果和HashMap是一样的。
public int FirstNotRepeatingChar(String str) {
int[] charIndex = new int['z'-'A'+1];
int[] counter = new int['z'-'A'+1];
for (int value : counter) {
value = 0;
}
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
counter[chars[i] - 'A'] += 1;
charIndex[chars[i] - 'A'] = i;
}
// 检查是否有只出现一次的数
int result = Integer.MAX_VALUE;
for (int i = 0; i < counter.length; i++) {
if (counter[i] == 1 && charIndex[i] < result) {
result = charIndex[i];
}
}
if (result == Integer.MAX_VALUE) {
return -1;
} else {
return result;
}
}