POJ-Anagrammatic Distance-字母距离

本文介绍了一种简单高效的方法来计算两个单词之间的Anagrammatic距离,即通过删除字符使两个单词成为anagrams所需的最少操作数。该方法通过统计每个字母在两个单词中出现的频率并计算绝对差值之和来实现。

题意
若两个单词所含的字母完全相同,则这两个单词可称为“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; }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值