Java机试题:删除字符串中出现次数最少的字符(使用正则处理)


描述

实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。 注意每个输入文件有多组输入,即多个字符串用回车隔开   数据范围:输入的字符串长度满足  ,保证输入的字符串中仅出现小写字母
import java.util.*;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
            String str = sc.nextLine();
            int minLen = -1;
            int tempLen = 0;
            // 找出最小次数
            for (int i = 0; i < str.length(); i++) {
                // 用正则匹配替换掉不是该字符的其他内容,则剩下的就是该字符,既可以获取该字符的长度
                tempLen = str.replaceAll("[^"+str.charAt(i) +"]","").length();
                if(minLen == -1 || minLen > tempLen){
                    minLen = tempLen;
                }
            }
            
            // 获取长度是最小长度,既需要删除的字符.注意这里不能在循环中直接改变str,因为会导致str长度变化,则匹配结果就是错的
            StringBuffer needDelChar = new StringBuffer();
            for (int i = 0; i < str.length(); i++) {
                tempLen = str.replaceAll("[^"+str.charAt(i) +"]","").length();
                if(tempLen == minLen){
                    needDelChar.append(str.charAt(i));
                }
            }
    
            // 删除掉次数最小的字符,[]不能删除,正则中[].表示一个字符内容。去掉则有几个就需要匹配到几个字符。
            // eg:[abc] 表示匹配a或b或c,abc表示匹配abc
            System.out.println(str.replaceAll("["+needDelChar.toString() + "]",""));
        }

    }

}