问题描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),
如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import java.util.function.Function;
import java.util.function.ToDoubleFunction;
import java.util.function.ToIntFunction;
import java.util.function.ToLongFunction;
/**
* @author 翔
*
*/
public class Main {
private static HashMap<String,Integer> map=new HashMap<String,Integer>();
private static HashMap<String,Integer> firstComeMap=new HashMap<String,Integer>();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int L=sc.nextInt();
String s=sc.next();
int index=0;
for(int i=L;i<=s.length();i++){
for(int j=0;j<=s.length()-i;j++){
String sub=s.substring(j, j+i);
if(map.containsKey(sub)){
map.put(sub,map.get(sub)+1);
}else{
map.put(sub,1);
firstComeMap.put(sub,index++);
}
}
}
Set<Entry<String,Integer>> entrySet=map.entrySet();
ArrayList<Entry<String,Integer>> list=new ArrayList<Entry<String,Integer>>();
Iterator<Entry<String, Integer>> it=entrySet.iterator();
while(it.hasNext()){
list.add((Entry<String, Integer>) it.next());
}
Collections.sort(list,new ListComparator());
String result=list.get(0).getKey();
if(list.size()>=2){
if(list.get(0).getValue()==list.get(1).getValue()){
if(list.get(0).getKey().length()==list.get(1).getKey().length()){
if(firstComeMap.get(list.get(0).getKey())>firstComeMap.get(list.get(1).getKey())){
result=list.get(1).getKey();
}
}
}
}
System.out.println(result);
}
}
class ListComparator implements Comparator<Entry<String, Integer>>{
public int compare(Entry<String, Integer> arg0, Entry<String, Integer> arg1) {
// TODO Auto-generated method stub
if(arg0.getValue()!=arg1.getValue()){
return arg1.getValue()-arg0.getValue();
}else{
return arg1.getKey().length()-arg0.getKey().length();
}
}
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> arg0) {
// TODO Auto-generated method stub
return null;
}
public static <T, U> Comparator<T> comparing(
Function<? super T, ? extends U> arg0, Comparator<? super U> arg1) {
// TODO Auto-generated method stub
return null;
}
public static <T> Comparator<T> comparingDouble(
ToDoubleFunction<? super T> arg0) {
// TODO Auto-generated method stub
return null;
}
public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> arg0) {
// TODO Auto-generated method stub
return null;
}
public static <T> Comparator<T> comparingLong(ToLongFunction<? super T> arg0) {
// TODO Auto-generated method stub
return null;
}
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
// TODO Auto-generated method stub
return null;
}
public static <T> Comparator<T> nullsFirst(Comparator<? super T> arg0) {
// TODO Auto-generated method stub
return null;
}
public static <T> Comparator<T> nullsLast(Comparator<? super T> arg0) {
// TODO Auto-generated method stub
return null;
}
public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {
// TODO Auto-generated method stub
return null;
}
public Comparator<Entry<String, Integer>> reversed() {
// TODO Auto-generated method stub
return null;
}
public Comparator<Entry<String, Integer>> thenComparing(
Comparator<? super Entry<String, Integer>> arg0) {
// TODO Auto-generated method stub
return null;
}
public <U extends Comparable<? super U>> Comparator<Entry<String, Integer>> thenComparing(
Function<? super Entry<String, Integer>, ? extends U> arg0) {
// TODO Auto-generated method stub
return null;
}
public <U> Comparator<Entry<String, Integer>> thenComparing(
Function<? super Entry<String, Integer>, ? extends U> arg0,
Comparator<? super U> arg1) {
// TODO Auto-generated method stub
return null;
}
public Comparator<Entry<String, Integer>> thenComparingDouble(
ToDoubleFunction<? super Entry<String, Integer>> arg0) {
// TODO Auto-generated method stub
return null;
}
public Comparator<Entry<String, Integer>> thenComparingInt(
ToIntFunction<? super Entry<String, Integer>> arg0) {
// TODO Auto-generated method stub
return null;
}
public Comparator<Entry<String, Integer>> thenComparingLong(
ToLongFunction<? super Entry<String, Integer>> arg0) {
// TODO Auto-generated method stub
return null;
}
}