C++:字符串中的第一个唯一字符

在这里插入图片描述

两种方法:时间复杂度为O(n²)和时间复杂度为O(n)的
第一种:时间复杂度为O(n)

class Solution {
public:
    int firstUniqChar(string s) 
    {
        if(s[0] == NULL)
            return -1;
        for(int i = 0; i<s.size(); i++)
        {
            int j = 0;
            int count = 0;
            while(j< s.size())
            {
                if(j == i)
                {
                    j++;
                    continue;//跳过i和j的下标一样的条件
                }
                if(s[i] == s[j])
                {
                    count++;
                    break;
                }
                j++;
            }
            if(count == 0)
            {
                return i;
            }
            
        }
        return -1;
    }
};

思路:从第一个数开始和所有的数对比,如果出现一次s[i] == s[j]就跳出内循环。跳出循环后判断是否一次都没出现s[i] == s[j]的情况,如果条件为真,返回i的位置。

第二种:时间复杂度为O(n)。类似于计数排序

class Solution {
public:
    int firstUniqChar(string s) 
    {
        int a[256] = {0};
        for(int i = 0; i < s.size(); i++)
        {
            a[s[i]] ++;//记录每一个a[i]的值。
        }
        
        for(int i = 0; i < s.size(); i++)
        {
            if(a[s[i]] == 1)//如果a[i] == 1 ,说明s[i]这个字符只出现了一次。
                return i;
        }
        return -1;
        
    }
};

思路:设计一个数组,将数组初始化。循环s.size()次,往a[i]中填充数据,i == 是s[i]时 a[i]++。遍历完成之后,再遍历一遍a数组,如果出现a[i] == 1的时候,跳出循环,返回i。

猜你喜欢

转载自blog.csdn.net/l477918269/article/details/86565936