给定Java算法能否生成符合Leet规则的treasure全量相似变体?
原代码可行性说明
你找到的这段Java代码的递归生成逻辑完全可以满足生成所有字符替换变体的需求,不需要修改核心生成逻辑,仅需将内置的字符映射表替换为符合Leet规则的a-z、0-9替换规则即可。
适配Leet变体生成的修改后代码
下面的代码已经针对treasure涉及的字符补充了常用的单字符Leet映射,所有替换字符均符合你要求的仅a-z、0-9范围:
import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class LeetGenerator { // Leet字符映射表,可自行增删替换规则 static Map<Character, char[]> leetMap = new HashMap<Character, char[]>() {{ put('a', new char[] {'4'}); put('b', new char[] {'8'}); put('c', new char[] {'k'}); put('e', new char[] {'3'}); put('g', new char[] {'9', '6'}); put('i', new char[] {'1', 'l'}); put('k', new char[] {'c'}); put('l', new char[] {'1', 'i'}); put('o', new char[] {'0'}); put('r', new char[] {'2'}); put('s', new char[] {'5', 'z'}); put('t', new char[] {'7'}); put('u', new char[] {'v', '0'}); put('v', new char[] {'u'}); put('z', new char[] {'2', 's'}); // 无替换规则的字符默认留空即可 put('d', new char[] {}); put('f', new char[] {}); put('h', new char[] {}); put('j', new char[] {}); put('m', new char[] {}); put('n', new char[] {}); put('p', new char[] {}); put('q', new char[] {}); put('w', new char[] {}); put('x', new char[] {}); put('y', new char[] {}); }}; public static Set<String> generateLeetVariants(String str) { Set<String> result = new HashSet<>(); // 统一转小写避免大写字符匹配不到映射 str = str.toLowerCase(); if (str.isEmpty()) { result.add(""); return result; } char currentChar = str.charAt(0); for (String tailVariant : generateLeetVariants(str.substring(1))) { // 保留原字符的选项 result.add(currentChar + tailVariant); // 遍历所有替换字符生成变体 char[] variants = leetMap.get(currentChar); if (variants != null) { for (char variant : variants) { result.add(variant + tailVariant); } } } return result; } // 运行即可直接输出treasure的所有变体 public static void main(String[] args) { Set<String> variants = generateLeetVariants("Treasure"); System.out.println("共生成变体数量:" + variants.size()); for (String variant : variants) { System.out.println(variant); } } }
使用说明
- 你可以自行修改
leetMap里的映射规则,增减每个字符对应的替换选项即可调整生成的变体范围 - 按当前映射规则,
treasure可生成576种变体,如果你需要更多变体,只需要给对应字符增加更多合法的替换选项即可 - 直接运行main方法就可以输出所有变体,修改main方法里的输入单词即可生成其他单词的Leet变体
内容的提问来源于stack exchange,提问作者Lewis
相关产品推荐
相关产品推荐

