删除小写字母字符串中重复字符。如果可以,优先删除重复字符中排在比他小字符前面的字符。
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; }
相关文章推荐
- 删除小写字母字符串中重复字符
- 删除小写字母字符串中重复字符
- 【字符串】删除小写字母字符串中重复字符
- 实现循环右移和删除小写字母字符串中重复字符——题集(二十)
- 删除小写字母字符串中重复字符。
- 华为:输入一个字符串,删除重复前面的字符,其余字符按原样顺序输出
- 删除小写字母字符串中重复字符
- 【数据结构】中删除小写字母字符串中重复字符
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进
- 判断字符串是否可以通过交换相邻字符得到回文字符串,如果可以输出最少交换次数
- 删除重复的字符(给一个字符串,删除连续重复的字符,要求时间复杂度为O(1)……)
- 给定一个字符串a,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长? 输出需要删除的字符个数。
- 找出字符串中第一个不重复出现的字符(仅小写字母)
- 删除字符串重复的字符
- c/c++生成不重复的字符串(6个字符组成,可表示的个数可以扩充),简易版数据库主键
- 删除字符串中相邻三个或以上重复的字符
- 腾讯 2017 暑假实习生编程题(一):给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 通过正则 来找出特定的字符 可以输出找出的字符 也可输出删除特定字符的原字符串
- 从字符串中删除重复的字符