算法笔记_061:蓝桥杯练习 字串统计(Java)
目录
1 问题描述
第二行是字符串S。
L大于0,且不超过S的长度。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
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)的更多相关文章
- 算法笔记_083:蓝桥杯练习 合并石子(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...
- 算法笔记_076:蓝桥杯练习 结点选择(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多 ...
- 算法笔记_075:蓝桥杯练习 最短路(Java)
目录 1 问题描述 2 解决方案 2.1 floyd算法解决 2.2 spfa算法解决 1 问题描述 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从 ...
- 算法笔记_064:蓝桥杯练习 操作格子(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求 ...
- 算法笔记_088:蓝桥杯练习 8-1因式分解(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 设计算法,用户输入合数,程序输出若个素数的乘积.例如,输入6,输出2*3.输入20,输出2*2*5. 样例 与上面的样例输入对应的输出. ...
- 算法笔记_095:蓝桥杯练习 拿糖果(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 妈妈给小B买了N块糖!但是她不允许小B直接吃掉. 假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数.这时,妈 ...
- 算法笔记_094:蓝桥杯练习 矩阵相乘(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性 ...
- 算法笔记_087:蓝桥杯练习 9-1九宫格(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 九宫格.输入1-9这9个数字的一种任意排序,构成3*3二维数组.如果每行.每列以及对角线之和都相等,打印1.否则打印0. 样例输出 与上面 ...
- 算法笔记_082:蓝桥杯练习 12-1三角形(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的周长.面积.中心和重心.输入三个点,输出这 ...
随机推荐
- 读书笔记(高性能javascript)(一)
1.加载与执行: (1)将脚本放在底部:(否则会阻塞) (2)由于每个<script>标签初始下载时都会阻塞页面渲染,所以减少页面包含的<script>标签数量有助于改善这一情 ...
- js中__proto__和prototype的区别和关系
首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性_ ...
- HttpClient不同版本超时时间的设置
引自 https://www.cnblogs.com/hisunhyx/p/5028391.html 3.X是这样的 HttpClient client=new DefaultHttpClient() ...
- 洛谷——P1109 学生分组
P1109 学生分组 题目描述 有N组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界R和下界L(L<=R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 ...
- 51nod 1201 (dp)
整数划分 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种.由于数据较大,输出Mod 10^9 + 7的结果即可. In ...
- linux centos下安装docker
1.在vm中装好好centos后,更新内核 运行docker需要内核版本为3.8或者更高的版本,内核必须支持一种合适的存储驱动(Drivice Mapper.AUFS.vfs.btrfs.ZFS),默 ...
- poj 1654:Area 区域 ---- 叉积(求多边形面积)
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19398 Accepted: 5311 利用叉积求多边形面 ...
- codevs 1962 马棚问题--序列型DP
1962 马棚问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束 ...
- Distinctive Image Features from Scale-Invariant Keypoints(个人翻译+笔记)-介绍
Distinctive Image Features from Scale-Invariant Keypoints,这篇论文是图像识别领域SIFT算法最为经典的一篇论文,导师给布置的第一篇任务就是它. ...
- CentOS 6.9下KVM虚拟机通过virt-clone克隆虚拟机(转)
一.virt-clone概述 1.virt-clone作用简介 virt-clone主要是用来克隆kvm虚拟机,并且通过Options.General Option.Storage Configura ...