1、首先使用LinkedList存储由'A'~'Z'的26个字符链表,作为加密的键值,之所以选择LinkedList,是因为可以方便的弹出第一个元素。
2、以HashMap来存储源字符和加密后字符之间的映射关系
3、从0~25开始遍历,首先获取到key中的字符,如果HashMap中没有,则加入,同时删掉LinkedList中的字符;如果HashMap中存在了(代表键值映射已经有了),则循环取下个。注意:在key的最后一个字符的时候,有可能HashMap中已经有了,则需要直接插入LinkedList中的首元素。
4、key遍历完了之后,则依次弹出LinkedList中的首元素,依次加入HashMap中,至此,源字符与加密后的字符键值映射关系已经完成
5、遍历需要加密的文本,经过加密后输出。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String key = sc.nextLine();
            String origin = sc.nextLine();
            LinkedList<Character> list = new LinkedList<Character>();
            for (int i = 0; i < 26; i++) {
                list.add(Character.toUpperCase((char) (65 + i)));
            }
            Map<Character, Character> map = new HashMap<Character, Character>();
            int len = key.length();
            for (int i = 0, j = 0; i < 26; i++) {
                if (j < len) {
                    char c;
                    do {
                        c = key.charAt(j++);
                    } while (map.containsValue(Character.toUpperCase(c)) && j < len);
                    if (j == len && map.containsValue(Character.toUpperCase(c))) {
                        map.put((char) (65 + i), list.removeFirst());
                    } else {
                        map.put((char) (65 + i), Character.toUpperCase(c));
                        list.remove((Character) Character.toUpperCase(c));
                    }
                } else {
                    map.put((char) (65 + i), list.removeFirst());
                }
            }
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < origin.length(); i++) {
                char c = origin.charAt(i);
                if (Character.isLetter(c)) {
                    char d = map.get(Character.toUpperCase(c));
                    if (Character.isLowerCase(c)) {
                        d = Character.toLowerCase(d);
                    }
                    sb.append(d);
                } else {
                    sb.append(c);
                }
            }
            System.out.println(sb.toString());
        }
    }
}