1. 程式人生 > >【藍橋杯】演算法訓練 字串統計

【藍橋杯】演算法訓練 字串統計

問題描述

  給定一個長度為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.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int l = 0;
		String s = "";
		if(sc.hasNext()){
			l = sc.nextInt();
			s = sc.next();
		}
		//使用一個雜湊表來儲存子串以及對應的出現次數
		HashMap<String,Integer> map = new HashMap<>();
		int maxVal = 0;//用來儲存出現最多次子串次數
		String maxStr = "";//用來儲存最長子串
		//使用列舉法
		for(int i=0;i<s.length()-l+1;i++){
			for(int j=i+l;j<s.length();j++){
				String str = s.substring(i, j);
				//如果這個字串之前已經出現過了
				if(map.containsKey(str)){
					int value = map.get(str);
					value++;
					if(value>maxVal){//如果次數比當前最大次數大,則將最長子串置換為當前字串
						maxVal = value;
						maxStr = str;
					} else if(value==maxVal){
						//若次數相等,則比較兩個字串的長度
						if(str.length()>maxStr.length()){
							maxStr = str;
						}
					}
					map.put(str, value);
				} else {
					//若該字串之前未出現過,則新增並初始化次數為1
					map.put(str, 1);
				}
			}
		}
		System.out.println(maxStr);
		
	}
}