题目主要信息

1、输入一个单词作为密匙,如果单词中包含有重复的字母,只保留第1个,其余几个丢弃,然后用字母表其他未出现过的字母按顺序接在后面,作为密钥,由A-Z对应这串密钥

2、保证输入的字符串中仅包含小写字母

3、多组输入

方法一:暴力

具体方法

借助ArrayList,将key和字母表的其他字母依次放入list中,如果有相同的值保留第一个,最后遍历需要加密的字符串,在list中查找对应的加密密码。最终输出结果即可。

alt

Java代码

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            String key = sc.next().toLowerCase();
            String s = sc.next();
            ArrayList<Character>  list = new ArrayList<>();
            for(int i=0;i<key.length();i++){
                //如果list中不存在就放入
                if(!list.contains(key.charAt(i))){
                    list.add(key.charAt(i));
                }
            }
            //将a-z放入到list中
            for(int i= 97;i<=122;i++){
                char c = (char) i;
                if(!list.contains(c))
                    list.add(c);
            }
            String result = "";
            for(int i=0;i<s.length();i++){
                if(s.charAt(i)>=97 && s.charAt(i)<=122){
                    result += list.get(s.charAt(i)-97);
                }else {
                    result += Character.toUpperCase(list.get(s.charAt(i)-97));
                }
            }
            System.out.println(result);
        }
    }
}

复杂度分析

  • 时间复杂度:O(m+n)O(m+n),其中mm为字符串key的长度,nn为字符串words的长度,需要分别遍历这两个字符串。
  • 空间复杂度:O(1)O(1),记录的密钥长度不超过26,属于常数空间

方法二:借助HashMap

具体方法

将方法一中得到的list存入到Map中,在遍历需要加密的字符串时,可以直接从Map中获得当前字符加密后的字符。

Java代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            String key = sc.next().toLowerCase();
            String s = sc.next();
            ArrayList<Character>  list = new ArrayList<>();
            for(int i=0;i<key.length();i++){
                //如果list中不存在就放入
                if(!list.contains(key.charAt(i))){
                    list.add(key.charAt(i));
                }
            }
            //将A-Z放入到list中
            for(int i= 97;i<=122;i++){
                char c = (char) i;
                if(!list.contains(c))
                    list.add(c);
            }
            Map<Character,Character> map = new HashMap<>();
            int begin = 97;
            for (int i=0;i<list.size();i++) {
                map.put((char)(begin+i),list.get(i));
            }

            StringBuilder result = new StringBuilder();
            for (int i=0;i<s.length();i++){
                char c = s.charAt(i);
                Character character = map.get(c);
                if(s.charAt(i)>=97 && s.charAt(i)<=122){
                    result.append(character);
                }else {
                    result.append(Character.toUpperCase(character));
                }
            }
            System.out.println(result.toString());
        }
    }
}

复杂度分析

  • 时间复杂度:O(m+n)O(m+n),其中mm为字符串key的长度,nn为字符串words的长度,需要分别遍历这两个字符串。
  • 空间复杂度:O(1)O(1),记录的密钥长度不超过26,属于常数空间