在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置

剑指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;
        
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值