对字符串的操作,无论再难的算法题,只要时间充足,相信每个同学都可以搞定。

但是浪费太多时间去搞一个逻辑算法没太大意义,学会学习,不但可以增长自己的知识,更可以节省时间,俗话说,一寸光阴一寸金,寸金难买寸光阴。

我在写这个算法之前,也在网上查过,只是网上的答案太长了,所以就想把自己的结果写出来,供大家参考,如果有问题,希望可以及时提出。

题目:

问题描述
  给定一个长度为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.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    String str = scan.next();
    String res = maxLetter(str,n);
    System.out.println(res);
  }

  private static String maxLetter(String str,int n){
    int m=0, tmp=0;
    String st;
    String res = null;
    int mm=0, maxLen = 0;
    int len = str.length();

    Map<String,Object> arr = new LinkedHashMap<String,Object>();
    Map<Object, Integer> mp = new LinkedHashMap<Object, Integer>();

    //将字符串按条件拆分,组合成键(子串)值(子串出现的次数)对应的集合

    //同时取出出现次数最多的次数
    for(int i=n; i<=len; i++){
      for(int k=0; k<len-i+1; k++){
        st = str.substring(k, k+i);
        if(arr.get(st) != null){
          tmp = Integer.parseInt(String.valueOf(arr.get(st)));
          arr.put(st, tmp+1);
        }else{
          arr.put(st, 1);
        }
        m = Math.max(m, Integer.parseInt(String.valueOf(arr.get(st))));
      }
    }

    //运用迭代遍历的方式取出出现次数最多的子串,重新组合键(字符串)值(字符串长度)的集合

    //因为可能会出现字符串出现次数相同,但字符串长度不同的情况,所以还要运用变量记录每个字符串的长度进行比较

    //如果没有比第一个字符串长度更大的字符串,就去第一个,如果有,就取出相应的字符串
    Iterator<?> it = arr.entrySet().iterator();
    while (it.hasNext()) {
      Map.Entry entry = (Map.Entry) it.next();
      int value = Integer.parseInt(String.valueOf(entry.getValue()));
      Object key = entry.getKey();
      if(value==m){
        value = String.valueOf(entry.getKey()).length();
        mp.put(key, value);
        mm = Math.max(mm, value);
      }
      if(mm>maxLen){
        res = (String) key;
        maxLen = mm;
      }
    }

    // System.out.println(mm+" "+mp);
    // System.out.println(maxLen+" "+res);
    // System.out.println(m+" "+arr);
    return res;
  }

}

Java实现字串统计的更多相关文章

  1. Java实现 蓝桥杯 算法训练 字串统计

    算法训练 字串统计 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最 ...

  2. java 蓝桥杯算法提高 字串统计

    思路:这道题用HashMap来保存枚举的字串,key值保存字串-value值保存字串所出现的次数:         通过for循环并使用subString()方法枚举所有符合要求的子串maxStr记录 ...

  3. [蓝桥杯]ALGO-87.算法训练_字串统计

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

  4. 算法笔记_061:蓝桥杯练习 字串统计(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然 ...

  5. java 复制字串算法

    public class Copy { public static void copy(char[] s, char[] t){ int i=0; for(i=0; i<s.length; i+ ...

  6. HDOJ 1261 字串数

    JAVA大数.... 字串数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  7. 字串数_hdu_1261(大数极致).java

    字串数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  8. java字串加密

    字串加密 1.设计思想: (1)加密方法,字符串的每一个字符都代表这个字符往后的第三位,最后三个字符代表,开始的三个字符. (2)解密方法,字符串的每一个字符都代表这个字符往前的第三位,开始三个字符代 ...

  9. Java如何计数字串中的一组词组?

    在Java编程中,如何计数字串中的一组词组? 以下示例演示如何使用regex.Matcher类的matcher.groupCount()方法来计算字符串中的一组词组. package com.yiib ...

随机推荐

  1. 用最少的JS代码写出贪吃蛇游戏---迷你版

    游戏进行页面展示 GAME  OVER 页面展示  代码如下: <!doctype html> <html>   <body>   <canvas id=&q ...

  2. C# 中使用反射的优缺点

    本文摘至于:http://blog.csdn.net/springfileld/article/details/17720537 ----------------------------------- ...

  3. python之时间日期calendar

    calendar是与日历相关的模块,calendar模块文件里定义了很多类型,主要有Calendar,TextCalendar以及HTMLCalendar类型.其中,Calendar是TextCale ...

  4. 实现单点登录功能的思路以及kafka同步数据

    单点登录以及用户数据同步思路与方案 当公司业务分布于多个子系统时, 同一用户在A系统注册,即可在其他所有关联系统使用, 并支持登录A系统后,自动在其他系统登录,退出同理. 在A平台修改通用的用户数据( ...

  5. 第九章· MySQL的备份和恢复

    一.备份的原因 运维工作的核心简单概括就两件事: 1)第一个是保护公司的数据. 2)第二个是让网站能7*24小时提供服务(用户体验).  备份的原因 1)备份就是为了恢复. 2)尽量减少数据的丢失( ...

  6. deep_learning_初学neural network

    神经网络——最易懂最清晰的一篇文章 神经网络是一门重要的机器学习技术.它是目前最为火热的研究方向--深度学习的基础.学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学 ...

  7. Webpack编译提示内存溢出解决方案

    在项目开发中,随着业务需求的复杂项目随之增大,再加上同一个文件被引用次数过于频繁在开发编译或者上线打包时经常会出现如下错误: 这个报错的意思就是Node内存不足所导致的,我们都知道 Node 是基于V ...

  8. zencart设置特价商品价格

    登录后台-工具-安装SQL脚本(Install SQL Patches) 运行以下语句: , '0001-01-01'); 红色部分请替换成实际要设置的数据:1234表示产品ID,888表示特价.

  9. LeetCode 01 两数之和

    链接:https://leetcode-cn.com/problems/two-sum 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们 ...

  10. 201871010101-陈来弟《面向对象程序设计(java)》第十七周学习总结

    实验十七  线程同步控制 实验时间 2018-12-10 第一部分:理论知识 1.多线程并发执行中的问题 ◆多个线程相对执行的顺序是不确定的. ◆线程执行顺序的不确定性会产生执行结果的不确定性. ◆在 ...