题目描述:
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
分析:
本题就是对一个给定的字符串找出第一个只出现一次的字符
要点:
1.只出现一次的字符 2.第一次出现 3.只由字母组成 4.区分大小写
思路:
因为字符串全是字母构成,因此对字符串中的字母进行频次统计时,可以构建26个字母专属的数组,(这里有一个坑,那就是区分大小写,就是得分别对大小写字母进行统计判别),① 对每个字母进行频次统计,并存放在数组中。② 然后再对字符串进行遍历,对每个遍历到的字母,到对应的字母频次数组中进行查询,如果出现频次为1,则立即返回其在字符串中的位置。
这里对于区分大小写的字母,我的做法是声明两个int[26]的数组,一个存放大写字母,另一个存放小写字母。
注意小写字母的ASCII值 是大于 大写字母的ASCII值的,因此比较时限定区间如“A~Z”比较稳妥。
代码:
public class Solution {
public int FirstNotRepeatingChar(String str) {
int len = str.length();
int fre[] = new int[26];
int bfre[]=new int[26];
int i = 0;
int total = -1;
while (i <= len - 1) {
char tmp = str.charAt(i);
if (tmp>='A'&&tmp<='Z') {
bfre[tmp - 'A']++;
}
else {
fre[ tmp - 'a']++;
}
i++;
}
for (int j = 0; j < len; j++) {
char tmp = str.charAt(j);
if (tmp>='A'&&tmp<='Z') {
if (bfre[tmp - 'A'] == 1) {
return j;
}
} else {
if (fre[tmp - 'a'] == 1) {
return j;
}
}
}
return total;
}
}