题目描述
接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
题目来源
描述
实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
数据范围:输入的字符串长度满足 1 <= n <=20 ,保证输入的字符串中仅出现小写字母
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
示例1
输入:aabcddd
输出:aaddd
思路
对输入字符串进行遍历,将其对应的ASCII码数值映射到另一个数组中(不要忘记初始化),根据字符串中某个字符出现的次数,在另一个数组中进行累加,然后对另一个数组进行遍历,找到大于0的最小值,将另一个数组中最小值的位置全置为零,再对储存字符串的原数组遍历,找到ASCII码大于0的字符,将其输出,即为所得。
具体实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char a[21];
int min = 22;
gets(a);
int b[200];
for (int c = 0; c < 200; c++)
{
b[c] = 0;//数组初始化
}
int temp;
int len = strlen(a);
for (int i = 0; i < len; i++)
{
temp = a[i];
b[temp]++;//映射到b数组,字符串中的某个字符的出现次数
}
for (int k = 97; k < 123; k++)
{
if (b[k] < min && b[k]>0)
min = b[k];//统计出现次数中的最少值
}
for (int k = 97; k < 123; k++)
{
if (b[k] == min)
b[k] = 0;
}
for (int i = 0; i < len; i++)
{
int m = a[i];
if (b[m] != 0)
{
printf("%c", a[i]);
}
}
return 0;
}
时间复杂度
O(n)
小结
一直暴力解,希望以后学点新的解法。