蓝桥杯算法训练:字串统计java

试题 算法训练 字串统计

给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。

输入样例1:
  4
  bbaabbaaaaa

输出样例1:
  bbaa

输入样例2:
  2
  bbaabbaaaaa

输出样例2:
  aa

思路

使用TreeSet可以判断该字符串中有多少种不同的长度为L的子串,再通过对字符串的剪切比较计数,取出最大的那个即可。如果有多个字串出现次数一样,则输出最长的,如果仍有多个,就输出第一个

import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class Main {
    static Set<String> set = new TreeSet<String>();
    static int max;//计数
    static String str1;
    static String str2;
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int l = s.nextInt();
        s.nextLine();
        String str = s.nextLine();
        max = 0;
        String ans = "";
        for (; l <= str.length(); l++) {//长度
            for (int i = 0; i <= str.length() - l; i++) {//起始点
                if (!set.contains(str.substring(i, i + l))) {
                    str1=str.substring(i, i + l);
                    set.add(str1);
                    int temp = 0;
                    for (int j = 0; j <= str.length() - l; j++)//从头开始比较,若字符串相符合则计数+1
                        str2=str.substring(j, j + l);
                        if (str2.equals(str1)) {
                            temp++;
                        }
                    }
                    if (max < temp) {
                        max = temp;
                        ans = str1;
                    }else if (max <= temp&&ans.length()<l){
                        max = temp;
                        ans = str1;
                    }
                }
            }
        }
        System.out.println(ans);
    }
}

发布了11 篇原创文章 · 获赞 0 · 访问量 149

猜你喜欢

转载自blog.csdn.net/Kim_Linshuo/article/details/105689821