Playfair密码表

题目1 : Playfair密码表

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

小Hi和小Ho经常用Playfair密码表加密自己的代码。 密码表是按以下步骤生成的。

1. 随机选择一个只包含大写字母的单词S作为密钥。  

2. 将S中的所有字母J替换为字母I。  

3. 将S中的字母依次填写进一个5x5的矩阵,按照从上到下、从左到右的顺序填充格子。填充过程中略过已经在密码表中的字母。  

4. 将'A'-'I', 'K'-'Z'(除去J之外的所有大写字母)中没有出现在密码表中的大写字母按照字母表顺序填入矩阵剩余的格子中。

举个例子:单词DIJSTRA,替换字母得到DIISTRA;将DIISTRA填入矩阵得到的密码表为(注意第二个I被略过了):

DISTR
A....
.....
.....
.....

最后将剩余字母填入,得到密码表:

DISTR
ABCEF
GHKLM
NOPQU
VWXYZ

给定作为密钥的单词,你能求出密码表吗?

输入

第1行:一行字符串,只包含大写字母,长度不超过200

输出

共5行,每行5个字母,表示密码表。

样例输入

HIHOCODER

样例输出

HIOCD
ERABF
GKLMN
PQSTU
VWXYZ

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        String res = solve(s);
        for (int i = 0; i < 5; i++) {
        	System.out.println(res.substring(i * 5, i * 5 + 5));
        }
        scanner.close();
    }
    
    private static String solve(String pk) {
    	boolean[] table = new boolean[128];
    	StringBuilder sb = new StringBuilder();
    	for (int i = 0; i < pk.length(); i++) {
    		char c = pk.charAt(i);
    		if (c == 'J') c = 'I';
    		if (!table[c]) {
    			sb.append(c);
    			table[c] = true;
    		}
    	}
    	table['J'] = true;
    	for (char c = 'A'; c <= 'Z'; c++) {
    		if (!table[c]) sb.append(c);
    	}
    	return sb.toString();
    }
    
}

猜你喜欢

转载自blog.csdn.net/weixin_38970751/article/details/86522504