用于重分布字符使所有字符串相等的代码存在什么问题?
代码错误分析
- 问题核心判定逻辑:由于允许任意移动字符,只要每个字符的总出现次数都可以被数组长度
n整除,就能平分到所有字符串中得到相等的内容,返回true,否则返回false。 - 你代码的核心逻辑完全错误,和正确判定规则不匹配:
你将所有字符的出现次数存入set后判断set大小是否为1,本质是要求所有字符的出现次数完全相等,会出现两类判定错误:- 本应返回
true的场景被误判为false:比如n=3,字符a共出现3次、字符b共出现6次,二者都可以被3整除,应当返回true,但你的set中存在3、6两个值,大小为2,会错误返回false。 - 本应返回
false的场景被误判为true:比如n=2,字符a共出现3次、字符b共出现3次,二者都不能被2整除,应当返回false,但你的set中只有3一个值,大小为1,会错误返回true。
- 本应返回
- 你标注的循环部分没有问题,功能是正确统计所有字符的总出现次数,无需修改。
修正后的代码示例
bool makeEqual(vector<string>& words) { int n = words.size(); int cnt[26] = {0}; for(int i = 0; i < n; i++) { for(char c : words[i]) { cnt[c - 'a']++; } } for(int i = 0; i < 26; i++) { if(cnt[i] % n != 0) { return false; } } return true; }
如果字符范围不止小写英文字母,你可以保留原来的map实现,只需要将后续的set判定逻辑替换为遍历map,判断每个字符的计数是否能被n整除即可。
内容的提问来源于stack exchange,提问作者ankit sharma
相关产品推荐
相关产品推荐

