求解:基于变位词生成所有可能句子的计数逻辑优化
变位词替换生成不同句子的计数解决方案
问题核心错误分析
你当前代码的问题在于用加法统计选项数,这只能计算替换单个单词的情况,完全忽略了多个单词同时替换的组合可能性。正确逻辑应该用乘法原理——每个单词的替换选择是独立的,所有选择的乘积就是总共有多少种不同句子。
修正后的逻辑步骤
- 初始化结果为
1(代表原句子本身这一种基础情况) - 遍历句子中的每个单词:
- 将单词字符排序生成键,去变位词映射中查找对应的变位词列表长度
- 如果单词不在映射中,默认只有自身1种选择
- 将当前结果乘以该变位词组的大小
- 最终结果即为所有可生成的不同句子数量
修正后的Java代码
import java.util.Arrays; import java.util.Collections; import java.util.Map; import java.util.List; static long getPossibleCount(String sentence, Map<String, List<String>> map) { long total = 1; String[] words = sentence.split(" "); for (String word : words) { char[] chars = word.toCharArray(); Arrays.sort(chars); String key = new String(chars); // 获取变位词组大小,默认1(单词无变位词时仅自身可选) int groupSize = map.getOrDefault(key, Collections.singletonList(word)).size(); total *= groupSize; } return total; }
关键说明
- 使用
long类型存储结果:句子最多20个单词,若每个单词有大量变位词,int会溢出,long能避免这个问题 - 初始值设为
1:每个单词至少有自身这一种选择,所有位置选自身就是原句子,对应1种情况 - 乘法逻辑的合理性:比如句子中有两个单词,分别有3种和2种变位词选择,总组合数是3×2=6种,覆盖了所有单替换、双替换和原句子的情况
示例验证
假设单词列表为["abc", "bca", "cab", "def", "fed"],句子为"abc def":
- 正确结果:3×2=6种
- 原代码输出:3+2=5种(明显错误,遗漏了同时替换两个单词的情况)
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

