题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
解法1:使用辅助数组
哈希表
类似文章中:19.找出数组中重复的数字https://blog.youkuaiyun.com/heda3/article/details/86760298
class Solution {
public:
int FirstNotRepeatingChar(string str)
{
if(str.length()==0)
return -1;
//int length=str.length();
int hash[256]={0};//全部由字符组成也不会超过256
// int * hash=new int[length+1];
int i=0;
while(str[i]!='\0')
{
hash[str[i]]++;
++i;
}
i=0;
while(str[i]!='\0')
{
if(1==hash[str[i]])
{
return i;
}
i++;
}
return -1;//没有返回-1
}
};
类似解法
思路:
1)利用每个字母的ASCII码做哈希表的index
2)也即是字母转化为整形-65或者直接减去'A'
3)哈希表长度58 由于A-Z对应的ASCII码为65-90,a-z对应的ASCII码值为97-122
class Solution {
public:
int FirstNotRepeatingChar(string str)
{
if(str.length()==0)
return -1;
//int length=str.length();
int hash[58]={0};//全部由字符组成也不会超过256
// int * hash=new int[length+1];
int i=0;
while(str[i]!='\0')
{
hash[str[i]-'A']++;//或者转化成整形-65
//hash[(int)str[i]-65]++;
++i;
}
i=0;
while(str[i]!='\0')
{
if(1==hash[(int)str[i]-65])//或者转化成整形-65
//if(1==hash[str[i]-'A'])//或者转化成整形-65
{
return i;
}
i++;
}
return -1;//没有返回-1
}
};
参考:https://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c