考研机试 68.子串计算

时间:2021/03/09

一.题目描述

给出一个01字符串(长度不超过100),求其每一个子串出现的次数。

输入描述

输入包含多行,每行一个字符串。

输出描述

对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。

题目链接

https://www.nowcoder.com/practice/bcad754c91a54994be31a239996e7c11?

tpId=40&tqId=21399&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

二.算法

题解

这里采用的是暴力搜索的方法,通过HashMap存放子串及出现的次数,然后用ArrayList存放出现次数超过一次的子串,使用Collections类的sort方法进行字典序排序,最后遍历输出结果。

代码

import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Collections;

public class Main{
    
    public static void main(String[] args){
        //读取输入
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String str = in.next();
            //求子串及出现次数
            HashMap<String, Integer> map = new HashMap<>();
            for(int i = 0; i < str.length(); i++){
                for(int j = i; j < str.length(); j++){
                    String temp = str.substring(i, j + 1);
                    if(map.containsKey(temp)){
                        int count = map.get(temp);
                        map.put(temp, count + 1);
                    }else{
                        map.put(temp, 1);
                    }
                }
            }
            //输出子串及出现次数(出现一次以上的)
            ArrayList<String> list = new ArrayList<>();
            int size = map.size();
            for(String s : map.keySet()){
                if(map.get(s) > 1){
                    list.add(s);
                }
            }
            Collections.sort(list);    //按字典序进行排序
            for(String s : list){
                System.out.println(s + " " + map.get(s));
            }
        }
    }
}
努力,向上,自律
原文地址:https://www.cnblogs.com/machi12/p/14504292.html