【剑指Offer】面试题35:第一个只出现一次的字符

一:题目描述

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


二:解题思路

(1)遍历字符串

创建一个数组,保存a-z  A-Z出现的次数:

1.没有出现过-1

2.只出现过一次,保存在字符串中的位置

3.出现超过一次,保存-2

(二)遍历数组

找到不为-1,同时不为-2的最小的值,即第一次只出现一次的字符

如果不存在这样的字符,返回-1



三:代码实现

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        //result用来表示a-z (0-25)  A-Z (26-51)
        //如果一个字符没有出现过-1表示,出现次数超过1次,则用-2表示,如果只出现一次,则result[i]代表第一次出现的位置
        vector<int> result(52,-1);
        
        int i;
        //第一次遍历字符串,统计各个字符出现的次数,位置
        for(i=0;i<str.size();i++){
             //result只有三种可能的取值,-1:该字母没有出现过  -2:该字母出现次数超过1次  i:该字母只出现过一次,i代表其出现的位置
            if(str[i]>='a' && str[i]<='z'){               
                 if(result[str[i]-'a']==-1)
                    result[str[i]-'a']=i;//如果只出现一次,记录位置
                 else
                     result[str[i]-'a']=-2;//如果出现超过一次,记为-2
            }
            else{
                if(result[str[i]-'A'+26]==-1)
                    result[str[i]-'A'+26]=i;//如果只出现一次,记录位置
                 else
                     result[str[i]-'A'+26]=-2;//如果出现超过一次,记为-2
            }
               
        }
        //遍历result,找到不为-1,-2,且i值最小
        bool isFind=false;
        int firstChar=INT_MAX;
        for(i=0;i<result.size();i++){
            if(result[i]!=-1 && result[i]!=-2){
                if(!isFind)
                    isFind=true;
                if(result[i]<firstChar)
                    firstChar=result[i];
            }
        }
        if(isFind)
            return firstChar;
        else
            return -1;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值