题目:给定两个单词,判断这两个单词是否是变位词。如果两个单词的字母完全相同,只是位置有所不同,则称这两个单词为变位词。例如eat和tea是变位词。
答:问题分析:判断是否为变位词,只需要分别统计两个单词的各个字母的次数,如果各个字母出现的次数一样,即为变位词。
思路:直接简单地统计两个单词的各个字母的次数,需要两个长度为52的数组(区分字母大小写),来存放各自的字母出现次数,并且统计好了之后还需要比较这两个数组是否相同。因此,可以采取以下方式:
for(int i=0;i<word1.length();i++){
a[word1[i]-'a']++;
a[word1[i]-'a']--;
}
只需要一个数组,存放的是两个单词的字母出现次数的差,差为0,证明是字母出现的次数一样。(注意,具体实现还需要考虑字母大小写)
具体代码:
#include<iostream>
#include<string>
using namespace std;int a[52];//初始值为0 bool isBianweici(string word1,string word2){if(word1.length()!=word1.length()) return false;for(int i=0;i<word1.length();i++){if(word1[i]>='a'&&word1[i]<='z'){//统计word1中字母出现次数 a[word1[i]-'a']++;}else if(word1[i]>='A'&&word1[i]<='Z'){a[word1[i]-'A'+26]++;}if(word2[i]>='a'&&word2[i]<='z'){//减去word2字母出现次数 a[word2[i]-'a']--;}else if(word2[i]>='A'&&word2[i]<='Z'){a[word2[i]-'A'+26]--;}}for(int i=0;i<52;i++){if(a[i]!=0){ return false;//不是变位词 }} return true;
}
int main(){string s1,s2;cout<<"请输入第1个单词:(区分大小写)";cin>>s1; cout<<"请输入第2个单词:(区分大小写)";cin>>s2;if(isBianweici(s1,s2)){cout<<s1<<"和"<<s2<<"是变位词"<<endl;}else{cout<<s1<<"和"<<s2<<"不是变位词"<<endl;}return 0;
}