您的朋友正在键盘上输入他的名字。有时,在键入字符c时,按键可能会被长按,并且该字符将被键入1次或多次。
我的怀疑::我试图用C ++ STL映射解决这个问题,但是对于这个测试用例,我得到了错误的答案:名称=“ saeed”
这是我的代码:
bool isLongPressedName(string name, string typed) {
unordered_map<char,int>m1,m2;
for(int i=0;i<name.size();i++)
{
m1[name[i]]++;
}
for(int i=0;i<typed.size();i++)
{
m2[typed[i]]++;
}
if(m2.size()!=m1.size()) return false;
int b=0;
for(int a=0;a<m2.size();a++)
{
if(typed[a]!=name[b] ||m2[typed[a]]<m1[name[b]] )
{
return false;
}
if(m2[typed[a]]>m1[name[b]])
{
return true;
}
b++;
}
return true;
请帮助我解决这个问题。
[基本上,不需要复杂的解决方案。只是一点点逻辑。
我们按字符比较字符。如果发现不匹配项,并且在“类型”中有一个双精度字,那么我们将跳过该双精度字。
我们在while循环中这样做:
while ((name[n] != typed[t]) && (t > 0) && (t < typed.size()) && (typed[t] == typed[t - 1])) ++t;
name[n] != typed[t]
t > 0
和t < typed.size()
中typed[t] == typed[t - 1]
相同。这是一个长按。++t
请参阅以下代码,包括一些测试用例(带有边际案例):
#include <iostream>
#include <string>
#include <utility>
#include <vector>
bool isLongPressedName(std::string name, std::string typed) {
// Initial assumption is that result is OK. Additionally check for some corner cases
bool result{ (!name.empty() || typed.empty())};
// As long as OK, go through both strings
for (size_t n{}, t{}; result && n < name.size() && t < typed.size(); ++n, ++t) {
// Jump over double characters as long as necessary
while ((name[n] != typed[t]) && (t > 0) && (t < typed.size()) && (typed[t] == typed[t - 1])) ++t;
// Calculate result
result = (name[n] == typed[t]);
}
return result;
}
int main() {
for (const auto& [name, typed] : std::vector<std::pair<std::string, std::string>>{
{"abc", "abc"}, {"abc", "abccccc"},{"abc", "aaaaabc"},{"abc", "abbbbbc"},{"abbc", "abccccc"},
{"ab", "ab"}, {"ab", "aaaaaab"},{"ab", "abbbb"},
{"saeed", "ssaaedd"},
{"saeed", "ssssaaeeeeedd"},
{"sss", "ssssssssss"},
{"s", "ss"},
{"", "s"},
{"", ""},
}) {
std::cout << "'" << name << "' and '" << typed << "' are long press equal? --> "
<< std::boolalpha << isLongPressedName(name, typed) << '\n';
}
return 0;
}
这里是另一种简单的方法:
bool isLongPressedName(string name, string typed) {
if (name.size() >= typed.size()) return false;
if (name.size() > 0 && name[0] != typed[0]) return false;
bool long_pressed = false;
int i = 1, j = 1;
while (i < name.size() && j < typed.size()) {
if (name[i] == typed[j]) {
++i; ++j;
} else {
if (name[i-1] == typed[j]) {
++j;
long_pressed = true;
} else {
return false;
}
}
}
return long_pressed;
}