LeetCode:387. 字符串中的第一个唯一字符

题目

LeetCode:387. 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

案例:
s = “leetcode”
返回 0.

s = “loveleetcode”,
返回 2.

注意事项:您可以假定该字符串只包含小写字母。

代码

1.暴力法

class Solution {
public:
    int firstUniqChar(string s) {
        int length=s.size();
        if(length<1)
        {
            return -1;
        }
        
        int flag=0;
        for(int i=0;i<length;i++)
        {
            char temp=s[i];
            for(int j=0;j<length;j++)
            {
                
                if(i==j)
                {
                    continue;
                }

                if(s[i]==s[j])
                {
                    flag=1;
                    break;
                }
            }

            if(flag==1)
            {
                flag=0;
            }
            else
            {
                return i;
            }
        }
        return -1;

    }
};

2.Map

class Solution {
public:
    int firstUniqChar(string s) {
        map<char,int>smap;
        for(char i:s)
        {
            smap[i]++;
        }

        for(int i=0;i<s.size();i++)
        {
            if(smap[s[i]]==1)
            {
                return i;
            }
        }

        return -1;
    }
};

3.数组模拟map操作

class Solution {
public:
    int firstUniqChar(string s) {
        // 题意表明,字符是否重复跟顺序无关,因此先以O(N)遍历所有字符,统计对应 字符 出现频率
        // 由于字符串 s 长度未知,但 26 个字母,可以只开 26的int[] 数组
        int arrCnt[26] = {0} ;
        for(auto cha : s) {
            arrCnt[cha - 'a']++;            
        }
        
        for(int i = 0;i<s.size();i++) {
            if(arrCnt[s[i] - 'a']==1) return i;
        }
        return -1;
    }
};

思路

根据提示使用哈希映射
遍历一遍字符串记录每个字母出现的次数
遍历hashmap,找出第一个出现次数只有一次的字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值