本题使用了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; } }