算法笔记_061-蓝桥杯练习 字串统计(Java)
来源:互联网 发布:js判断json是否存在 编辑:程序博客网 时间:2024/04/30 07:48
目录
1 问题描述
2 解决方案
1 问题描述
问题描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
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:5bbaabaaaaabbbbbbbababaabaabaabbabababbbabbabbabbbabaabaa
0 0
- 算法笔记_061-蓝桥杯练习 字串统计(Java)
- 算法笔记_061-蓝桥杯练习 字串统计(Java)
- 算法笔记_061-蓝桥杯练习 字串统计(Java)
- 算法笔记_061-蓝桥杯练习 字串统计(Java)
- 蓝桥杯-字串统计(java)
- 蓝桥杯-算法训练-字串统计-Java
- 蓝桥杯 算法训练 字串统计 JAVA
- 蓝桥杯-算法训练-字串统计-Java
- Java蓝桥杯基础算法练习-01字串
- java 蓝桥杯 字串统计
- 蓝桥杯 算法训练 字串统计
- 蓝桥杯 算法训练 字串统计
- 蓝桥杯--算法训练 字串统计
- 蓝桥杯 算法训练 字串统计
- 蓝桥杯 算法训练 字串统计
- 蓝桥杯 算法训练 字串统计
- 蓝桥杯 算法训练 字串统计
- [蓝桥杯]算法训练 字串统计
- 【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区别
- C语言字符串函数大全
- Problem--116A--Codeforces--Tram
- 白话java设计模式
- 开发板截屏问题
- 算法笔记_061-蓝桥杯练习 字串统计(Java)
- FormBorderStyle.None时,支持改变窗体大小
- BZOJ2101: [Usaco2010 Dec]Treasure Chest 藏宝箱
- C++返回值为对象时复制构造函数不执行怎么办
- 独立显卡安装黑屏问题
- 极客学院ios开发工程师系列课程
- java集合系列——Set之HashSet和TreeSet介绍(十)
- Python学习笔记(七)——Python 类
- php--缓冲区