无法理解此字谜问题解决方案背后的逻辑

时间:2019-06-29 07:58:30

标签: java arrays data-structures anagram

给出两个字符串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);

2 个答案:

答案 0 :(得分:1)

此代码段遍历每个字符串,并计算每个字母在其中的出现次数(并将计数器存储在数组中以提高性能)。

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

答案 1 :(得分:0)

好的,这就是程序使用两个for循环的过程。

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

现在,您有两篇论文从左到右写有“ A”至“ Z”,并且在执行了两个“ for循环”之后,每篇论文的“相应的字符串输入。

现在,如果在两张纸上都打了一个字母,请放任它,如果您在一张纸上(即在数组中)找到了打勾的字母,而在另一张纸上没有被打勾,则算一下作为要删除的字母。

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

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

因此,当前两个for循环结束时,'cnt1'和'cnt2'数组中的每一个都将随机包含'1'。如果对于给定的索引,两个数组中都有“ 1”或“ 0”,则不必对它们进行计数,即它们是否不同,即,两个数组的特定索引的差为“ 1”(这就是为什么您看到Math的原因。 abs),那么该字母就是要从第一个字符串或第二个字符串中删除的字母。

编辑:对于竞争性考试,您应该首先可以看到解决方案,然后找到最佳解决方案。计算机只会提高找到的解决方案的速度。他们不思考,我们让他们思考:)

希望您可以先将解决方案可视化,并且仍然习惯于编程。祝一切顺利!