字串统计

来源:互联网 发布:韩日军力对比知乎 编辑:程序博客网 时间:2024/03/29 22:53
问题描述
  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。

  输入样例1:
  4
  bbaabbaaaaa

  输出样例1:
  bbaa

  输入样例2:
  2
  bbaabbaaaaa

  输出样例2:
  aa
数据规模和约定
  n<=60
  S中所有字符都是小写英文字母。

  提示
  枚举所有可能的子串,统计出现次数,找出符合条件的那个
解题思路:关键是如何才能枚举所有的字符串,不能遗漏,当初认为aaaa里面含有两个aa就是错误的,认识不当,这里面包含了3个aa。

import java.util.*;  import java.math.*;public class Main{static int SubStringCnt(String str,String substr)//计算一个字串在字符串里面出现的次数{int count=0;for(int i=0;i<=str.length()-substr.length();i++)//每次向后移动一个位置得到不同的字串进行判断,而不是移动substr的长度{if(substr.equals(str.substring(i, i+substr.length()))){count++;}}return count;}public static void main(String[] args){Scanner sc=new Scanner(System.in);int L=sc.nextInt();String s=sc.next();String str_obj=s.substring(0,L);//先假定第一个字串为目标字串int max_count=1;//假设最多出现的次数是0for(int i=L;i<=s.length();i++)//长度要大于等于L的都要进行循环计算{for(int t=0;t+i<=s.length();t++)//这层循环不能少,是对每次移动一个位置后的得到的字串重新计算出现次数,不可少{int tm=SubStringCnt(s,s.substring(t, t+i));if(tm>max_count)//相同长度下,后来的字串只有长度大于前面出现的时候才能进行赋值,并且更新最大值{max_count=tm;str_obj=s.substring(t, t+i);}else if(tm==max_count)//如果在出现次数相同的情况下,字串长度多的要替换原来的{if(str_obj.length()<i){str_obj=s.substring(t,t+i);}}}}System.out.println(str_obj);}}












0 0
原创粉丝点击