奮鬥吧,少年!
阿新 • • 發佈:2019-02-01
問題描述
給定一個長度為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。
第二行是字串S。
L大於0,且不超過S的長度。 輸出格式 一行,題目要求的字串。
輸入樣例1:
4
bbaabbaaaaa
輸出樣例1:
bbaa
輸入樣例2:
2
bbaabbaaaaa
輸出樣例2:
aa 資料規模和約定 n<=60
S中所有字元都是小寫英文字母。
提示
列舉所有可能的子串,統計出現次數,找出符合條件的那個
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); } }