算法练习Day5
题目描述
实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
数据范围:输入的字符串长度满足 1 \le n \le 20 \1≤n≤20 ,保证输入的字符串中仅出现小写字母
题目来源
输入描述
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
输入:
aabcddd
输出:
aaddd
思路
1.采用一个只有26个字符的辅助数组
2.遍历字符串,字母每出现一次,对应的数组值就加一
3.遍历辅助数组,找到数组值不为零且值最小的数值
4.再次遍历字符串,只输出对应辅助数组中值不等于最小值的字符
具体实现
#include<stdio.h>
#include<string>
#include<stdlib.h>
#include <iostream>
using namespace std;
int main()
{
string str;
getline(cin,str);
int i = str.length();
char c[26] = { 0 };
for (int j = 0; j < i; j++)
{
c[str[j]- 'a']++;
}
int min = c[str[0] - 'a'];
for (int k = 0; k < 26; k++)
{
if (c[k] > 0 && c[k] < min)
min = c[k];
}
for (int m = 0; m < i; m++)
{
if (c[str[m] - 'a'] > min)
{
printf("%c", str[m]);
}
}
return 0;
}
时间复杂度
时间复杂度为0(n)
空间复杂度只用到了常数空间,所以为O(1)
小结
数组数目有限时采用辅助数组可以节省时间