试题 算法训练 字串统计
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
思路
使用TreeSet可以判断该字符串中有多少种不同的长度为L的子串,再通过对字符串的剪切比较计数,取出最大的那个即可。如果有多个字串出现次数一样,则输出最长的,如果仍有多个,就输出第一个
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Main {
static Set<String> set = new TreeSet<String>();
static int max;//计数
static String str1;
static String str2;
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int l = s.nextInt();
s.nextLine();
String str = s.nextLine();
max = 0;
String ans = "";
for (; l <= str.length(); l++) {//长度
for (int i = 0; i <= str.length() - l; i++) {//起始点
if (!set.contains(str.substring(i, i + l))) {
str1=str.substring(i, i + l);
set.add(str1);
int temp = 0;
for (int j = 0; j <= str.length() - l; j++)//从头开始比较,若字符串相符合则计数+1
str2=str.substring(j, j + l);
if (str2.equals(str1)) {
temp++;
}
}
if (max < temp) {
max = temp;
ans = str1;
}else if (max <= temp&&ans.length()<l){
max = temp;
ans = str1;
}
}
}
}
System.out.println(ans);
}
}