题目:
对于两个字符串A和B,如果A和B中出现的字符种类相同且每种字符出现的次数相同,则A和B互为变形词,请设计一个高效算法,检查两给定串是否互为变形词。
给定两个字符串A和B及他们的长度,请返回一个bool值,代表他们是否互为变形词。
思路:统计各字符串中字符出现的次数 逐次比较即可。
注:C++中字符串的ASCII码范围0~255 因此可以用固定长度数组代替HashMap节省存储空间。
算法复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
贴代码:
// 如果给定的2个字符串长度都不相同 肯定不可能是变形词 直接返回false
if(lena != lenb)
{
return false;
}
// 统计2个字符串中各个字符出现的次数 256表示字符串ASCII码的最大值+1
vector<int> ACnt(256, 0);
vector<int> BCnt(256, 0);
for(int i = 0; i < lena; ++i)
{
ACnt[A[i]]++;
BCnt[B[i]]++;
}
for(int i = 0; i < 256; ++i)
{
if(ACnt[i] != BCnt[i])
{
return false;
}
}
return true;
测试函数:
int main(void)
{
string A = "abc";
string B = "bcc";
cout<<chkTransform(A, A.length(), B, B.length())<<endl;
return 0;
}
输出:
0