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

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

这个时候题目没有要求是多少时间复杂度,
并且字符串中也只有小写字母,暂时不考虑大写字母;初步想法是两次遍历找到字符串中重复的字符;然后动态申请一个与字符串大小一样的数组;将出现重复的位置标1;最后寻找数组中第一个0的位置就行;具体的代码如下:


#include<iostream>
#include<string>
#include<memory>

using namespace std;
class Solution {
public:
	int firstUniqChar(string s) {
		int n = s.size(); char temp; 
		unique_ptr<int[]> num(new int[n]());//用unique_ptr去建立动态数组可以使用下标操作;在memory函数下;
		if (n<1)
			return -1;
		if (n == 1)    
			return 0;
		for (int i = 0; i<n - 1; i++)
		{
			temp = s[i];
			for (int j = i + 1; j<n; j++)
			{
				if (temp == s[j])
				{
					num[i] = num[j] = 1;
					break;
				}
				continue;
			}
		}
		for (int i = 0; i<n; i++)
		{
			if (num[i] == 0)
				return i;
		}
		return -1;
	}
};

但是因为这样做的话时间复杂度为o(n^2);并且没有办法处理复杂的环境,比如说有大写字母的时候,
所以想到应用ASCII码去做,会很方便;第一步先定义一个长度为256的0数组(其实125应该也够了);第二步遍历字符串,将每个字符串中的字符对应的ACSII码位置标1,如果出现相同的,则在原有位置加1;第三步还是遍历字符串,找到第一个字符对应的ASCII码位置为1的字符,返回其位置;这样时间复杂度为0(n),并且可以处理大写字符;代码如下:

#include <iostream>  //利用ASCII码表;
using namespace std;

class Solution {
public:
	int firstUniqChar(string s)
	{
		int p[256] = { 0 }; int n = s.size();
		for (int i = 0; i < n; i++)
		{
			p[s[i]] += 1;
		}
		for (int j = 0; j < n; j++)
		{
			if (p[s[j]] == 1)
			{
				return j;
			}
		}
		return -1;
	}
};
int main()
{
	Solution temp;
	string s = "loveleetcode";
	cout << temp.firstUniqChar(s) << endl;
	system("pause");
	return 0;
}

点赞