L1-003 个位数统计 (15分)
本题使用了KMP匹配模式串算法
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1
实现代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String strings = bf.readLine();
int[] ints = new int[10];
char[] chars = strings.toCharArray(),chs;
Set<String> set = new HashSet<String>(Arrays.asList(strings.split("")));
for (String s:set) {
chs = s.toCharArray();
ints[Integer.parseInt(s)] = KMPReturnCount(chars,chs);
}
for (int i = 0; i < 10; i++) {
if (ints[i] != 0){
System.out.println(i + ":" + ints[i]);
}
}
}
/**
* 求KMP算法的临时数组next[]
* @param pattern 模式串
* @return next
*/
public static int[] computeTemporaryArray(char pattern[]){
int[] next = new int[pattern.length];
int j = 0;
for (int i = 1; i < next.length;) {
if (pattern[i] == pattern[j]){
next[i] = j+1;
i++;
j++;
}else {
if(j != 0){
j = next[j-1];
}else {
next[i] = 0;
i++;
}
}
}
return next;
}
/**
* KMP算法本体 返回匹配到的数量
* @param text 主串
* @param pattern 模式串
* @return int 匹配到的字符串的数量
*/
public static int KMPReturnCount(char[] text , char[] pattern){
int[] next = computeTemporaryArray(pattern);
int i=0;
int j=0;
int count=0;
while(i < text.length && j<pattern.length){
if (text[i] == pattern[j]){
i++;
j++;
}else{
if (j==0){
i++;
}else {
j= next[j-1];
}
}
if (j >= pattern.length){
j = 0;
count++;
}
}
return count;
}
}