1. 程式人生 > >奮鬥吧,少年!

奮鬥吧,少年!

問題描述   給定一個長度為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;//假設最多出現的次數是0
		for(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);
	}
}