java解法

生成所有字母组合: 由于输入的数字串 nums 可能对应多个字母,我们需要生成所有可能的字母组合。可以通过类似多重循环的方式生成这些组合,每个数字选择一个字母进行拼接。为了避免直接使用多层循环,我们使用一个数组 indices 来表示每个数字在其对应字母集合中的当前位置,然后利用该数组进行组合生成。

组合生成:

从左到右遍历每个数字,选择其对应字母集合中的一个字母。
使用一个 StringBuilder 来拼接当前组合,并将其加入结果列表 result,如果该组合不包含屏蔽字符串中的所有字符。
递增逻辑:

当我们生成一个字母组合后,需要递增组合的 “位置”。如果某一位的字母已经到达其字母集合的最后一个字母,则回退到该集合的第一个字母,并递增上一位。
如果所有的字母集合都回退到第一个字母,说明所有组合已经生成完毕。
返回结果:

最终,将所有符合条件的字母组合连接成一个以逗号分隔的字符串,返回。

import java.util.*;

public class Main {
    // 数字与字母的映射关系
    static String nums;
    static String filter;
    static String[] map = {"abc", "def", "ghi", "jkl", "mno", "pqr", "st", "uv", "wx", "yz"};
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 读取数字串和过滤字符串
        nums = sc.nextLine();
        filter = sc.nextLine();
        // 输出符合条件的字母组合
        System.out.println(getResult());
    }
    
    // 获取所有符合条件的字母组合
    public static String getResult() {
        int n = nums.length();  // 获取数字串长度
        int[] indices = new int[n];  // 数组用于跟踪每个数字对应字母集合中的当前位置
        List<String> result = new ArrayList<>();  // 存储符合条件的字母组合
        
        // 使用while循环生成所有可能的字母组合
        while (true) {
            StringBuilder sb = new StringBuilder();
            // 根据当前的 indices 数组生成字母组合
            for (int i = 0; i < n; i++) {
                sb.append(map[nums.charAt(i) - '0'].charAt(indices[i]));  // 通过 map 获取字母
            }
            // 如果字母组合不包含屏蔽字符串中的所有字符,则添加到结果列表
            if (!containsAll(sb.toString(), filter)) {
                result.add(sb.toString());
            }
            
            // 寻找下一个字母组合
            int pos = n - 1;  // 从最后一位开始查找
            while (pos >= 0) {
                // 如果当前位的字母集合还有更多的字母,递增该位的索引
                if (indices[pos] < map[nums.charAt(pos) - '0'].length() - 1) {
                    indices[pos]++;
                    break;
                } else {
                    // 如果该位已到达字母集合的最后一个字母,回退并继续递增上一位
                    indices[pos] = 0;
                    pos--;
                }
            }
            // 如果所有位都回退到最初的状态,说明已生成所有组合,跳出循环
            if (pos < 0) break;
        }
        
        // 将所有符合条件的组合以逗号分隔并返回
        return String.join(",", result) + ",";
    }
    
    // 检查字符串是否包含过滤字符串中的所有字符
    public static boolean containsAll(String s, String filter) {
        // 遍历过滤字符串中的每个字符,检查是否在当前组合中
        for (char c : filter.toCharArray()) {
            if (!s.contains(String.valueOf(c))) {
                return false;
            }
        }
        return true;
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144514574"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!