算法打卡day5-删去出现次数最小的字符

73 阅读1分钟

题目描述

实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。

数据范围:输入的字符串长度满足 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循环没有加括号等等),这个解法其实比较笨,希望能在别人的博客中学到更简便的写法。