两种方法:时间复杂度为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。