题目描述
实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
数据范围:输入的字符串长度满足 1 <= n <=20 ,保证输入的字符串中仅出现小写字母
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
示例1
输入:aabcddd
输出:aaddd
思路
以空间换时间的思路,设置三个数组,str,str1,str2,分别用于保存输入数组、每个字符出现次数和输出数组
具体实现
#include <stdio.h>
#include <string.h>
int main() {
int i, j, k, m = 0, min; //min为最少出现次数
char str[20] = {0}; //初始输入的字符串为str
gets(str);
int str1[26]; //设置辅助数组统计每个字符出现的次数
for(i=0;i<26;i++)//初始化数组str1
str1[i]=0;
char str2[20] = {0}; //保存删除后的字符串
for (i = 0; i < strlen(str); i++) //统计每个字符出现的次数
str1[(int)str[i]-97]++;
min = 21;
for (j = 0; j < 26; j++) {//遍历str1找出字符最小出现次数
if (str1[j] < min && str1[j]>0)
min = str1[j];
}
for (k = 0; k < strlen(str);k++){ //删去出现次数最少的字符得到新的字符串
if (str1[(int)str[k]-97] != min) { //如果该字符不是出现次数最小的字符
str2[m] = str[k];
m++;
}
else { //如果该字符是出现次数最小的字符
continue;
}
}
printf("%s", str2);
return 0;
}
时间复杂度
时间复杂度O(n)
空间复杂度O(n)
小结
本题其实不太难,解的过程中犯了一些低级错误(如需要用str1时写成了str、for循环没有加括号等等),这个解法其实比较笨,希望能在别人的博客中学到更简便的写法。