无法理解这个字谜问题解决方案背后的逻辑[关闭]

Posted

技术标签:

【中文标题】无法理解这个字谜问题解决方案背后的逻辑[关闭]【英文标题】:Can't understand the logic behind this anagram problem's solution [closed] 【发布时间】:2019-11-10 22:45:57 【问题描述】:

给定两个字符串,a 和 b,长度可能相同也可能不同,确定生成 a 和 b 字谜所需的最小字符删除数。可以从任一字符串中删除任何字符。

这是我第一次为竞争性编程做准备,理解两个 for 循环背后的逻辑对我来说相当困难。

String str1 = s.next();               
String str2 = s.next();
char []c1 = str1.toCharArray();
char []c2 = str2.toCharArray();
int []cnt1 = new int[26];
int []cnt2 = new int[26];

int len1 = str1.length();
for (int i = 0; i < len1; i++) 
    cnt1[c1[i] - 97]++;


int len2 = str2.length();
for (int i = 0; i < len2; i++) 
    cnt2[c2[i] - 97]++;


int cnt = 0;
for (int i = 0; i < 26; i++) 
    cnt += Math.abs(cnt2[i] - cnt1[i]);


System.out.println(cnt);

【问题讨论】:

欢迎来到***。您能否更准确地添加您的问题? 【参考方案1】:

这个 sn-p 遍历每个字符串并计算每个字母在其中出现的次数(并将计数器存储在数组中以获得更好的性能)。

然后它遍历两个计数器数组,并为每个字母减去两个字符串的计数器(绝对值)。区别在于应该删除的那个字符的数量。将这些差异相加,得出的结果就是答案。

【讨论】:

【参考方案2】:

好的,这就是程序使用两个 for 循环所做的事情。

将'cnt1'想象成从左到右写在纸上的英文字母'A'到'Z','cnt2'也是如此。第一个 for 循环是在纸上标记一个字母,如果它在 'string1' 中找到,第二个 for 'string2' 也是如此。

现在,你有两篇论文,从左到右写着“A”到“Z”,在执行了两个“for循环”之后,每篇论文的字母上都有刻度线相应的字符串输入。

现在,如果一个字母在两张纸上都打勾,不要理会它,如果你发现在一张纸上打勾的任何一个字母(即在数组中),而在另一张数组中没有打勾,然后算上它作为要删除的信件。

当您像这样从左到右扫描两张纸时,您将有许多字母需要从两张纸上全部删除。

让我们看看它是如何在代码中实现的。原始数组的默认初始值全为零,并且通过将特定索引更改为“1”来实现在纸上“标记”字母的行为。

所以,到前两个 for 循环结束时,'cnt1' 和 'cnt2' 数组中的每一个都会随机包含 '1'。如果对于给定的索引,两个数组都包含“1”或“0”,则无需计算它,如果它们不同,即两个数组的特定索引的差异为“1”(这就是您看到 Math.1 的原因)。 abs 被使用),那么这是要从第一个字符串或第二个字符串中删除的字母。

edit:对于竞争性考试,您应该能够首先可视化解决方案,然后找到最佳解决方案。计算机只会为找到的解决方案增加速度。他们不思考,我们让他们思考:)

希望您可以先将解决方案可视化,并且仍然习惯于编程。万事如意!

【讨论】:

以上是关于无法理解这个字谜问题解决方案背后的逻辑[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

无法按组解决字谜?

字谜Python 3 [关闭]

大型字谜搜索未读取到集合 Python 的末尾

您将如何处理 PHP + MySQL 字谜求解器? [关闭]

理解二分查找问题中的范围问题

请解释字谜的代码,我无法理解计数器数组,每个值已经是 0