我需要完成函数scramble(str1, str2),如果str1的一部分字符可以重新排列以匹配str2,则返回true,否则返回false。我该如何改进这段代码的性能?
例如,如果str1和str2中有超过200k个字符,性能非常差。
这是一个符合我的要求的现成解决方案。这个解决方案的想法是由@Dave提供的。
bool scramble(const string& s1, const string& s2)
{
string reference = s2;
string inputStr = s1;
size_t refLen = reference.length();
size_t lenCounter = 0;
for (auto n = 0; n < reference.length(); n++)
{
auto tempLetter = reference[n];
size_t letterPos = inputStr.find(tempLetter);
if (letterPos != string::npos)
{
lenCounter++;
inputStr.erase(letterPos, 1);
if (lenCounter == refLen)
{
return true;
}
}
else
return false;
}
if (refLen == lenCounter)
return true;
else
return false;
}
这是一个符合我的要求的现成解决方案。这个解决方案的想法是由@Dave提供的。
bool scramble(const string& s1, const string& s2)
{
string ref = s2;
string input = s1;
string result = "";
char tempLetter = '\0';
sort(ref.begin(), ref.end());
sort(input.begin(), input.end());
map<char, int> letters;
for (auto n = 0; n < input.length(); n++)
{
tempLetter = input[n];
map<char, int> ::iterator it = letters.find(tempLetter);
if (it == letters.end())
{
letters.insert(make_pair(tempLetter, 0));
letters.at(tempLetter) = 1;
}
else
{
letters.at(tempLetter) += 1;
}
}
for (auto i = 0; i < ref.length(); i++)
{
tempLetter = ref[i];
map<char, int> ::iterator it = letters.find(tempLetter);
if (it != letters.end() && letters.at(tempLetter) >=0)
{
letters.at(tempLetter) -= 1;
if (letters.at(tempLetter) < 0)
return false;
result.push_back(tempLetter);
}
}
if (result!=ref)
return false;
else
return true;
}