判断两个字符串是否互为变形词

来源:互联网 发布:网络推广文案例子 编辑:程序博客网 时间:2024/04/29 04:14

题目:

给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,则str1和str2互为变形词。

请实现函数判断两个字符串是否互为变形词。

举例:

str1="123", str2="231", 返回true;

str1="123", str2="2331",返回false。

难度:

代码:

#include <iostream>#include <algorithm>#include <string>using namespace std;int main(){string str1, str2;getline(cin, str1);getline(cin, str2);int len1 = str1.size(), len2 = str2.size(),i;if (len1 != len2){cout << 'N';return 0;}sort(str1.begin(), str1.end());sort(str2.begin(), str2.end());for (i = 0; i < len1; i++){if (str1[i] != str2[i]){cout << 'N';return 0;}}cout << 'Y';return 0;}
思路:

题目要求是只要保证两个字符串的种类相同、个数相等就是变形词。

首先,判断两个字符串长度是否相等,若满足,则进行下一步判断;若不满足,则可以直接判定不是变形词;

其次,对这两个字符串分别进行升序排列;

再次,遍历整个字符串,判断相同下标的字符是否相等。循环中判断有不等,则可以判定不是变形词;若遍历结束仍相等,则可以判定是变形词。

参考代码:

#include <iostream>#include <string>#include <map>using namespace std;int main(){string str1, str2;map<char, int>m;getline(cin, str1);getline(cin, str2);int len1 = str1.size(), len2 = str2.size(),i;if (len1 != len2){cout << 'N';return 0;}for (i = 0; i < len1; i++)m[str1[i]]++;for (i = 0; i < len2; i++){if (--m[str2[i]] < 0){cout << 'N';return 0;}}cout << 'Y';return 0;}
思路:

如果字符串str1和str2长度不同,直接返回false。

如果长度相同,动态申请一个map空间m,m[a]=b代表字符a出现次数为b,初始时为0;

先遍历字符串str1,统计每种字符出现次数,如遍历到字符'a',则m['a']++。这样就形成了str1中每种字符的词频统计表。

再遍历字符串str2,每遍历到一个字符都在m中把词频减一,如遍历到字符'a',则m['a']--。

如果减小之后的值小于0,直接返回false;如果遍历完str2,m中的值没有出现负值,则返回true。


0 0