题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)
思路分析
其实主要还是 hash ,利用每个字母的 ASCII 码作 hash 来作为数组的 index。
首先用一个 58 长度的数组来存储每个字母出现的次数,为什么是 58 ?
主要是由于 A-Z 对应的 ASCII 码为 65-90,a-z 对应的 ASCII 码值为 97-122 ,而每个字母的 index = int(word) - 65。
而且 ASCII 码中的 90-96 不是字母,但是为了统一减 65 来计算,所以要再加上 6 个长度,不然就要判断是否是小写字母 ,小写字母要减 65 再减 6。
比如 g =103-65=38,而数组中具体记录的内容是该字母出现的次数,最终遍历一遍字符串,找出第一个数组内容为 1 的字母就可以了,时间复杂度为 O(n)
解释说明:
public class Solution {
public int FirstNotRepeatingChar(String str) {
int[ ] words = new int[ 58 ];
for(int i = 0; i < str.length(); i++){
//第一次遍历,记录出现的次数
words[( (int)str.charAt(i) ) - 65 ] + = 1;
}
for(int i = 0; i< str.length(); i++){
//第二次遍历,判断是否第一次出现且为 1 次
if( words[ ( (int)str.charAt(i) ) - 65 ] == 1 )
return i;
}
return -1;
}
}
链接:https://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c?f=discussion
来源:牛客网