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

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

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

题目:

问题描述
  给定一个长度为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. EBS常用表_Dictionary

    EBS常用表:转载于 https://blog.csdn.net/xiariqingcao/article/details/8775827 . OU.库存组织 SELECT hou.organizat ...

  2. Redis-Set常用命令

    Redis-Set常用命令 Set与List的区别在于,Set保存的队列数据是不重复的,且无序 sadd key value- 在指定key对应的集合中添加 value集合,如果key不存在,即新创建 ...

  3. 4.Linux用户与权限管理

    Linux 系统是一个多用于多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统 新增用户: useradd  新用户名 设置密码:pa ...

  4. python转化13位时间戳

    # -*- coding: utf-8 -*- def get_time_stamp13(datetime_obj): import datetime, time # 生成13时间戳 eg:15578 ...

  5. 开源you-get项目爬虫,以及基于python+selenium的自动测试利器

    写在前面 爬虫和自动测试,对于python来说是最合适不过也是最擅长的. 开源的项目也很多,例如you-get项目https://github.com/soimort/you-get.盗链和爬虫神器. ...

  6. electron api sendInputEvent 源码

    electron-master\electron-master\shell\browser\api\atom_api_web_contents.cc // Copyright (c) 2014 Git ...

  7. 利用协程和socket实现并发

    服务端代码 from gevent import monkey monkey.patch_all() from gevent import spawn import socket def commun ...

  8. 并发编程:协程TCP、非阻塞IO、多路复用、

    一.线程池实现阻塞IO 二.非阻塞IO模型 三.多路复用,降低CPU占用 四.模拟异步IO 一.线程池实现阻塞IO 线程阻塞IO 客户端 import socket c = socket.socket ...

  9. Selenium(1)

    一.Selenium->Se(硒)->功能自动化测试工具=功能自动化测试工具(QTP)<-Mercury(汞) 1.Selenium介绍 (1)Selenium 是针对web被测系统 ...

  10. 关于Spring MVC写的不错的几篇博客

    关于Spring MVC写的不错的几篇博客 https://my.oschina.net/kolbe/blog/509810 https://www.cnblogs.com/sunniest/p/45 ...