考研机试 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)); } } } }
努力,向上,自律