华为OD机试 - 过滤组合字符串 - 深度优先搜索dfs算法(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

每个数字关联多个字母,关联关系如下:

  • 0 关联 “a”,”b”,”c”
  • 1 关联 “d”,”e”,”f”
  • 2 关联 “g”,”h”,”i”
  • 3 关联 “j”,”k”,”l”
  • 4 关联 “m”,”n”,”o”
  • 5 关联 “p”,”q”,”r”
  • 6 关联 “s”,”t”
  • 7 关联 “u”,”v”
  • 8 关联 “w”,”x”
  • 9 关联 “y”,”z”
  1. 输入一串数字后,通过数字和字母的对应关系可以得到多个字母字符串(要求按照数字的顺序组合字母字符串);
  2. 屏蔽字符串:屏蔽字符串中的所有字母不能同时在输出的字符串出现,如屏蔽字符串是abc,则要求字符串中不能同时出现a,b,c,但是允许同时出现a,b或a,c或b,c等;
  3. 给定一个数字字符串和一个屏蔽字符串,输出所有可能的字符组合;
  4. 例如输入数字字符串78和屏蔽字符串ux,输出结果为uw。

二、输入描述

第一行输入为一串数字字符串,数字字符串中的数字不允许重复,数字字符串的长度大于0,小于等于5;
第二行输入是屏蔽字符串,屏蔽字符串的长度一定小于数字字符串的长度,屏蔽字符串中字符不会重复;

三、输出描述

输出可能的字符串组合

注:字符串之间使用逗号隔开,最后一个字符串后携带逗号

四、解题思路

  1. 定义数组arr,存储每个数字关联多个字母;
  2. 第一行输入为一串数字字符串;
  3. 第二行输入是屏蔽字符串;
  4. 定义集合list,加载第一行字母关联的数字;
  5. 并将集合list加载到map中;
  6. 使用深度优先搜索dfs算法,遍历map;
  7. 输出所有可能的输出可能的字符串组合。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest {
    static Map<Integer, List<Character>> map = new HashMap<Integer, List<Character>>();
    static String[] numArr = null;
    static List<String> okList = new ArrayList<>();

    public static void main(String[] args) {
        // 每个数字关联多个字母,关联关系如下
        String[] arr = {"abc", "def", "ghi", "jkl", "mno", "pqr", "st", "uv", "wx", "yz"};
        Scanner sc = new Scanner(System.in);
        String input1 = sc.nextLine();
        String input2 = sc.nextLine();
        List<Integer> numberList = new ArrayList<>();
        for (int i = 0; i < input1.length(); i++) {
            numberList.add(Integer.parseInt(input1.charAt(i) + ""));
        }
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (numberList.contains(i)) {
                // 第一行字母关联的数字
                List<Character> list = new ArrayList<Character>();
                for (int j = 0; j < arr[i].length(); j++) {
                    list.add(arr[i].charAt(j));
                }
                map.put(count++, list);
            }
        }
        numArr = new String[map.size()];
        dfs(0);
        for (String s : okList) {
            if (s.indexOf(input2) == -1) {
                System.out.print(s + ",");
            }
        }
    }

    static StringBuilder builder = new StringBuilder();
    public static void dfs(int num) {
        if (num == map.size()) {
            for (int i = 0; i < numArr.length; i++) {
                builder.append(numArr[i]);
            }
            okList.add(builder.toString());
            builder.setLength(0);
            return;
        }
        for (int i = 0; i < map.get(num).size(); i++) {
            numArr[num] = map.get(num).get(i) + "";
            dfs(num + 1);
        }
    }
}

六、效果展示

1、输入

89
wy

2、输出

wz,xy,xz,

3、说明

89对应"wx", “yz”。

屏蔽wy。

“wx”, "yz"四种有效组合,屏蔽wy,变为wz,xy,xz,

华为OD机试 - 过滤组合字符串 - 深度优先搜索dfs算法(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,算法,深度优先)