您的位置:首页 > 其它

删除小写字母字符串中重复字符。如果可以,优先删除重复字符中排在比他小字符前面的字符。

2017-08-18 17:05 363 查看

将N个字符的数组,循环右移K位。时间复杂度O(N)。

思路1

申请一块空间大小为之前的2倍,然后左旋K位就代表,新字符串的新起始下标为之前的begin加偏移量k,把新字符串返回即可。这个时间复杂度为O(N)

思路2

保存0号字符的值,从后往前赋值即可,循环k次。这个时间复杂度为O(KN)

思路1代码

#include<iostream>
#include<vector>
#include<iterator>
using namespace std;
string& Rotate_K(string & s, size_t k)
{
if (s.compare("") == 0||k==0)
return s;
size_t nums = s.size()%k;
string s2(s);
s2.resize(s.size() * 2);
std::copy(s.begin(), s.end(), s2.begin()+ s.size());
s=s2.substr(nums,s.size());
}


删除小写字母字符串中重复字符。如果可以,优先删除重复字符中在字符串中较前的字符。

比如,输入:bbcacdww;输出:bacdw

列子观察

由列子观察可得,当某个字符出现多次时,只把当该字符最后一次出现在字符串时才往前搬移,这样就满足要求优先删除重复字符中较前的字符。

思路

我们定一个哈希表记录每次出现的次数,然后定义俩个字符,当该字符出现次数为1时才搬移,当大于1时对它的出现次数减一即可。

#include<iostream>
#include<vector>
#include<iterator>
using namespace std;
string& delete_small_char(string&s)
{
vector<int> v1(256);
for (int idx = 0; idx < s.size(); ++idx)
{
++v1[s[idx]];
}
string::iterator iter = s.begin();
string::iterator result = s.begin();
while (iter != s.end())
{
if (v1[*iter]>1)
--v1[*iter];
else if (v1[*iter]==1)
{
--v1[*iter];
*result = *iter;
++result;
}
++iter;
}
s.resize(distance(s.begin(), result));
return s;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐