Problem: HJ23 删除字符串中出现次数最少的字符
题目描述
描述
实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
数据范围:输入的字符串长度满足 ,保证输入的字符串中仅出现小写字母
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
示例1
输入:
aabcddd
输出:aaddd
解题思路
使用map统计,在过滤。
算法流程
- 在main方法中创建一个Scanner对象,用于读取输入。
- 使用while循环来处理多个输入案例,直到没有下一行输入为止。
- 使用in.nextLine()方法读取一行输入,并将其存储在名为str的字符串变量中。
- 创建一个HashMap对象,用于存储字符和其出现次数的映射关系。
- 使用for-each循环遍历字符串中的每个字符,将字符作为键,将其出现次数作为值存储在HashMap中。
- 创建一个变量minCountC,并将其初始化为Integer.MAX_VALUE。
- 使用for-each循环遍历HashMap中的每个值,找到最小的出现次数,并将其存储在minCountC中。
- 创建一个StringBuilder对象,用于存储结果字符串。
- 使用for-each循环遍历字符串中的每个字符,如果字符的出现次数不等于minCountC,则将字符添加到结果字符串中。
- 使用System.out.println()方法打印结果字符串。
代码
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String str = in.nextLine();
Map<Character, Integer> map = new HashMap<>();
for (char c : str.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
int minCountC = Integer.MAX_VALUE;
for (int count : map.values()) {
minCountC = Math.min(minCountC, count);
}
StringBuilder res = new StringBuilder();
for (char c : str.toCharArray()) {
if (map.get(c) != minCountC) res.append(c);
}
System.out.println(res);
}
}
}
复杂度
- 时间复杂度:
- 读取输入的时间复杂度为O(n),其中n是输入字符串的长度。
- 遍历字符串并将字符和出现次数存储在HashMap中的时间复杂度为O(n)。
- 遍历HashMap中的每个值找到最小的出现次数的时间复杂度为O(m),其中m是不同字符的数量。
- 遍历字符串并将不满足最小出现次数条件的字符添加到结果字符串中的时间复杂度为O(n)。
- 打印结果字符串的时间复杂度为O(n)。
- 因此,总的时间复杂度为O(n + m)。
- 空间复杂度:
- 使用HashMap存储字符和出现次数的空间复杂度为O(m),其中m是不同字符的数量。
- 使用StringBuilder存储结果字符串的空间复杂度为O(n)。
因此,总的空间复杂度为O(n + m)。