问题描述

如果一个字符串 S 恰好可以由某个字符串重复 K 次得到,我们就称 S 是K 次重复字符串。例如 “abcabcabc” 可以看作是 “abc” 重复 3 次得到,所以“abcabcabc” 是 3 次重复字符串。同理 “aaaaaa” 既是 2 次重复字符串、又是 3 次重复字符串和 6 次重复字符串。现在给定一个字符串 S ,请你计算最少要修改其中几个字符,可以使 S 变为一个 K 次字符串?

输入格式

输入第一行包含一个整数 K。 第二行包含一个只含小写字母的字符串 S 。

输出格式

输出一个整数代表答案。如果 S 无法修改成 K 次重复字符串,输出 − 1。

样例输入

2 aabbaa

样例输出

2

评测用例规模与约定

对于所有评测用例,1 ≤ K ≤ 100000, 1 ≤ | S | ≤ 100000。其中 | S | 表示 S 的长度。


import java.util.Scanner;

public class Main {
	
	public static void main(String [] args) {
		// TODO Auto-generated method stub
		String ss ;
		int max_ch = 0;
		
		Scanner sc = new Scanner(System.in);
		
		char[] ch = new char[26];

		int k = sc.nextInt();
		ss = sc.next();

		if(ss.length()%k!=0) {
			System.out.println(-1);
			return;
		}

		int ll = ss.length()/k;
		
		char [][] pa =new  char[k][ll];
		
		for (int i = 0; i < k ;i++) {
			
			for (int j = 0; j < ss.length()/k; j++) {
				
			       pa[i][j] = ss.charAt(i*ll+j);
			}
		}

		for (int i = 0; i < ll; i++) {
			
			for (int j = 0; j < k; j++) {
				ch[pa[j][i]-'a'] ++;
			}
			
			int c = 0;
			for (int j = 0; j < 26; j++) {
				if(ch[j]!=0) {
					c ++;
				}
			}

			if(c==1) {
				
				for (int j = 0; j < 26; j++) {
					ch[j] = 0;
				}
				
			continue;	
			} 

			///
			int max = 0;
			int max_pos= 0;
			int cha_num = 0;
			for (int j = 0; j < 26; j++) {
				if(max<ch[j]) {
					max = ch[j];
					max_pos = j;
				} 
			}
			// 找到最大的啦
			
			for (int j = 0; j < 26; j++) {
				if(j!=max_pos) {
					cha_num += ch[j];
				}
			}

			max_ch += cha_num;

			for (int j = 0; j < 26; j++) {
				ch[j] = 0;
			}
			
		}
		System.out.println(max_ch);

		
	}

}

注 : 目前通过了百分之90,最后一个 好像控制台没有把字符串全部输入