PTA 程序设计天梯赛 Java L1-003 个位数统计 (15分) && 顺便复习了一下KMP匹配模式串算法

L1-003 个位数统计 (15分)

本题使用了KMP匹配模式串算法

给定一个 k 位整数 N=d​k−1​​ 10​k−1​​ +⋯+d​1​​ 10​1​​ +d​0​​  (0≤d​i​​ ≤9, i=0,⋯,k−1, d​k−1​​ >0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:
每个输入包含 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;
    }
}


猜你喜欢

转载自blog.csdn.net/qq_37079157/article/details/109207062
今日推荐