题意
若两个单词所含的字母完全相同,则这两个单词可称为“anagrams”。给出两个单词,通过对单词中的字母进行删除,可以使用两个单词成为anagrams。Anagrammatic Distance被定义为需要进行删除的单词数量。
分析
一种解法是先对两个单词进行排序,然后求两个单词的LCS值,最求返回(单词1长度-LCS)+(单词2长度-LCS)即可。但这种解法显得比较麻烦了。
另一种解法是,直接统计两个单词各个字母出现的次数,再对相应次数求差(绝对值),然后将这差值求和即可。
代码
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <iostream>
using namespace std;
/*计算距离的函数*/
int getDistance(const string &s1, const string &s2) {
if(s1.size() == 0)
return s2.size();
if(s2.size() == 0)
return s1.size();
int counts1[26]; //存储s1各个字母出现的次数
int counts2[26]; //存储s2各个字母出现的次数
/*初始化*/
memset(counts1, 0, sizeof(counts1));
memset(counts2, 0, sizeof(counts2));
/*统计字母出现次数*/
for(string::size_type i = 0; i < s1.size(); i++)
counts1[s1[i] - 'a']++;
for(string::size_type i = 0; i < s2.size(); i++)
counts2[s2[i] - 'a']++;
int ans = 0;
/*对各个字母出现的次数进行求和*/
for(int i = 0; i < 26; i++) {
ans = ans + abs(counts1[i] - counts2[i]);
}
return ans;
}
int main()
{
int n;
scanf("%d/n", &n); //注意要去掉'/n'!
string s1, s2;
for(int i = 0; i < n; i++) {
getline(cin, s1); //s1并不包括'/n'
getline(cin, s2);
int ans = getDistance(s1, s2);
printf("Case #%d: %d/n", i + 1, ans);
}
return 0;
}
POJ-Anagrammatic Distance-字母距离
最新推荐文章于 2020-03-12 13:58:12 发布
本文介绍了一种简单高效的方法来计算两个单词之间的Anagrammatic距离,即通过删除字符使两个单词成为anagrams所需的最少操作数。该方法通过统计每个字母在两个单词中出现的频率并计算绝对差值之和来实现。
654

被折叠的 条评论
为什么被折叠?



