算法练习Day5

125 阅读1分钟

算法练习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)

小结

数组数目有限时采用辅助数组可以节省时间