目录

1 问题描述

2 解决方案

 


1 问题描述

问题描述
  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。

  输入样例1:
  4
  bbaabbaaaaa

  输出样例1:
  bbaa

  输入样例2:
  2
  bbaabbaaaaa

  输出样例2:
  aa

数据规模和约定
  n<=60
  S中所有字符都是小写英文字母。
提示
  枚举所有可能的子串,统计出现次数,找出符合条件的那个

2 解决方案

前三次提交只得了40分,只怪自己把KMP模式匹配算法写错了,冒汗...

本题主要考查KMP模式匹配算法,思想比较简单,具体可以理解可以看注释哦

具体代码如下:

package com.liuzhen.systemExe;

import java.util.Scanner;

public class Main{
//KMP算法求取next函数值
public int[] getNext(char[] array) {
int[] next = new int[array.length + 1];
int j = 0;
for(int i = 1;i < array.length;i++) {
while(j > 0 && array[i] != array[j]) {
j = next[j];
}
if(array[i] == array[j]) {
j++;
}
next[i + 1] = j;
}
return next;
}
//使用KMP算法求取arrayB子串在arrayA中符合匹配的个数
public int getKmpCount(char[] arrayA, char[] arrayB) {
int count = 0;
int[] next = getNext(arrayB);
int j = 0;
for(int i = 0;i < arrayA.length;i++) {
while(j > 0 && arrayA[i] != arrayB[j]) {
j = next[j];
}
if(arrayA[i] == arrayB[j])
j++;
if(j == arrayB.length) {
count++;
i = i - j + 1; //此处是因为题目中说:不同的出现可以相交
j = 0;
}
}
return count;
}
//获取arrayA的开始位置为start长度L的子串
public char[] getPartString(char[] arrayA, int start, int L) {
char[] result = new char[L];
int i = 0;
while(i < L) {
result[i++] = arrayA[start++];
}
return result;
}
//打印符合题意的子串
public void printResult(String A, int L) {
if(L <= 0 || L > A.length() || A.length() > 60 || A.equals(null))
return;
char[] arrayA = A.toCharArray();
char[] max = getPartString(arrayA, 0, L);
int maxCount = 1;
while(L < arrayA.length) {
for(int start = 0;start < arrayA.length - L;start++) {
char[] partA = getPartString(arrayA, start, L);
int tempCount = getKmpCount(arrayA, partA);
if(tempCount > maxCount || (tempCount == maxCount && partA.length > max.length)) {
maxCount = tempCount;
max = partA;
}
}
L++;
}
System.out.println(max);
} public static void main(String[] args){
Main test = new Main();
Scanner in = new Scanner(System.in);
// System.out.println("请输入一个整数L和一个字符串A:");
int L = in.nextInt();
in.nextLine();
String A = in.nextLine();
test.printResult(A, L);
}
}

运行结果:

请输入一个整数L和一个字符串A:
5
bbaabaaaaabbbbbbbababaabaabaabbabababbbabbabbabbba
baabaa

算法笔记_061:蓝桥杯练习 字串统计(Java)的更多相关文章

  1. 算法笔记_083:蓝桥杯练习 合并石子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...

  2. 算法笔记_076:蓝桥杯练习 结点选择(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多 ...

  3. 算法笔记_075:蓝桥杯练习 最短路(Java)

    目录 1 问题描述 2 解决方案 2.1 floyd算法解决 2.2 spfa算法解决   1 问题描述 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从 ...

  4. 算法笔记_064:蓝桥杯练习 操作格子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求 ...

  5. 算法笔记_088:蓝桥杯练习 8-1因式分解(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 设计算法,用户输入合数,程序输出若个素数的乘积.例如,输入6,输出2*3.输入20,输出2*2*5. 样例 与上面的样例输入对应的输出. ...

  6. 算法笔记_095:蓝桥杯练习 拿糖果(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 妈妈给小B买了N块糖!但是她不允许小B直接吃掉. 假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数.这时,妈 ...

  7. 算法笔记_094:蓝桥杯练习 矩阵相乘(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性 ...

  8. 算法笔记_087:蓝桥杯练习 9-1九宫格(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 九宫格.输入1-9这9个数字的一种任意排序,构成3*3二维数组.如果每行.每列以及对角线之和都相等,打印1.否则打印0. 样例输出 与上面 ...

  9. 算法笔记_082:蓝桥杯练习 12-1三角形(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的周长.面积.中心和重心.输入三个点,输出这 ...

随机推荐

  1. Container With Most Water(LintCode)

    Container With Most Water Given n non-negative integers a1, a2, ..., an, where each represents a poi ...

  2. 【BZOJ 1478】 1478: Sgu282 Isomorphism (置换、burnside引理)

    1478: Sgu282 Isomorphism Description 给 定一个N 个结点的无向完全图( 任意两个结点之间有一条边), 现在你可以用 M 种颜色对这个图的每条边进行染色,每条边必须 ...

  3. [BZOJ5251][九省联考2018]劈配(网络流)

    5251: [2018多省省队联测]劈配 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 33  Solved: 22[Submit][Status][ ...

  4. [Codeforces #196] Tutorial

    Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...

  5. [AGC025D]Choosing Points

    [AGC025D]Choosing Points 题目大意: 输⼊\(n(n\le300),d_1,d_2\),你要找到\(n^2\)个整点\((x,y)\)满⾜\(0\le x,y<2n\). ...

  6. django, form.errors处理

    from.errors其实就是一个字典, 可以利用for error in form.errors.values, 或者for key,  value in form.errors遍历得到其中的数据

  7. oracle client PLSQL配置

    date:20140525auth:Jin platform :windows 一.服务端启动服务和创建账号# su - oracle$ lsnrctl start$ sqlplus / as sys ...

  8. Smart config风险分析与对策

    Smart config风险分析与对策 1.简介:          Smart config是一种将未联网设备快速连接wifi的技术,大概原理如下图所示: 2.业务需求:          要求实现 ...

  9. [典型漏洞分享]从一个手动分析的反射型XSS漏洞看待一个安全设计原则【中危】

    这是在测试YS“本地相册”功能时发现的一个反射型XSS,自己在安全测试过程中也发现过不少XSS漏洞,唯独这个的发现过程有点区别. 在此之前,我在测试另外一个模块的功能接口的时候发现了一个反射型XSS, ...

  10. 打印出C# 中float ,double 在内存中的存放形式

    float floatA = 2.2f; ); ; i < ;++i ) { uint temp = 0x80000000 & (a << i); ) { Console.W ...