判断是否是变位词
题目:给定两个单词,判断这两个单词是否是变位词。如果两个单词的字母完全相同,只是位置有所不同,则称这两个单词为变位词。例如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;
}