剑指offer:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
思路:用空间换时间。1)建立一个长为256的数组,其实全部由字母组成也可以建立一个长度26*2=52的数组,但是稍微麻烦,这里不使用。
将所有元素全部初始化为0;2)遍历字符串,将对应字符对应的数组元素加一;3)再次遍历字符串,直到找到第一个字符对应的数组元素值为1的元素。
代码1:用c中的char*字符串,由于题中给出的是str类型,因此需要转换。刚开始还自己申请了内存,代码更加复杂。
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int length = str.size();
if(length == 0)
return -1;
const int tableSize = 256;
//创建哈希表,并且各元素都初始化为0
unsigned int hashTable[tableSize];
for(unsigned int i = 0; i < tableSize; ++i)
hashTable[i] = 0;
//char* pChar = new char[tableSize];
//char* pHashKey = pChar;
char* pHashKey = &str[0];
//strcpy(pHashKey,str.c_str());
//找出每个字符键值对应的个数
while(*(pHashKey) != '\0')
hashTable[*(pHashKey++)]++;
//strcpy(pHashKey,str.c_str());
pHashKey = &str[0];
//找到第一个只出现一次的字符
char resultChar = NULL;
while(*(pHashKey) != '\0'){
if(hashTable[*pHashKey] == 1){
resultChar = *pHashKey;
break;
}
pHashKey++;
}
//delete[] pChar;
if(resultChar == NULL)
return 0;
//如果有字符,找出该字符出现的位置
for(int i = 0; i < length; ++i){
if(str[i] == resultChar)
return i;
}
return -1;
}
};
代码二:直接用c++中的string字符串。string是一个类型,有很多对应的函数可以用,比如str.size(),
str.reverse()等,比较好用
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int length = str.size();
if(length == 0)
return -1;
const int tableSize = 256;
unsigned int hashTable[tableSize];
for(unsigned int i = 0; i < tableSize; ++i)
hashTable[i] = 0;
for(int i = 0; i < length; i++){
hashTable[str[i]]++;
}
for(int i = 0; i < length; i++){
if(hashTable[str[i]] == 1)
return i;
}
return -1;
}
};