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

xiaoxiao2021-02-28  11

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

我的思路是这样的:

首先计算出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.很多时候,在可以假设有限变量时用数组会更加方便。

好了,我们下期见!

转载请注明原文地址: https://www.6miu.com/read-2603324.html

最新回复(0)