LeetCode刷题——字符串中的第一个唯一字符

大家好,结束了五一假期,继续刷题日记。本次题目要求如下:


我的思路是这样的:

首先计算出s的长度并将s复制给一个字符串cont,进入while循环,知道字符串s为空,使用.find()函数寻找字符串里是否有与s[0]相同的字符若有,使用remove函数把所有与s[0]相同的字符包括s[0]移到字符串尾部,并用erase删除掉这些字符。若没有,则使用.find寻找这个字符在cont中对应的下标i并返回i。循环结束返回-1.

代码如下:

class Solution {
public:
    int firstUniqChar(string s) {
        int len = s.size();
	string cont = s;
	int num;
	int i = 0;


	while(s.size() > 0){
		num = s.find(s[0], 1);
		if (num < 0){
			i = cont.find(s[0]);
			return i;
		}
		else{
			const char p = s[0];
			s.erase(remove(s.begin(), s.end(), p), s.end());
		}
	}
	return -1;
    }
};

但是有一个问题,这样运行下去效率不是很高,在网上看到一个更简单的方法:

首先统计字符串中26个字母的个数,然后在个数为1的字母中找下标最小的返回其下标,如果没有个数为1的,返回-1。代码如下:

class Solution {
public:
    int firstUniqChar(string s) {
        int n=s.size();
        if(n==0)
            return -1;
        int a[26]={0};
        for(int i=0;i<n;i++){
            a[s[i]-'a']++;
        }
        for(int i=0;i<n;i++)
        {
            if(a[s[i]-'a']==1)
                return i;
        }
        return -1;
    }
};

通过这道题学习到的地方有:

1.

C++要从字符串中删除所有某个特定字符, 可用如下代码:

str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

他是将str中所有的a移到字符串的末尾并返回一个新的end,这个end就是不包含a的新字符串的末尾的下一位,我们再用erase将这个新的end到字符串原始end之间的字符删掉,就是删掉了字符串中所有的a。

2.很多时候,在可以假设有限变量时用数组会更加方便。

好了,我们下期见!

猜你喜欢

转载自blog.csdn.net/miss_yuki/article/details/80167368