最近,我在做一道leetcode问题。在这个问题中,我尝试创建一个地图
int maximumLength(string s) {
int n = (int)s.length();
auto comp = [&](const string& s1, const string& s2) { return (int)s1.length() < (int)s2.length(); };
map<string, int, decltype(comp)> msi(comp);
// map<string, int, LengthComparator> msi;
for (auto i = 0; i < n; i++) {
for (auto j = 1; j < n - i + 1; j++) {
string tmp = s.substr(i, j);
cout << tmp << endl;
msi[tmp] += 1;
}
debug(msi);
}
int res = -1;
for (auto it = rbegin(msi); it != rend(msi); it++) {
cout << it->first << " " << it->second << endl;
// if (it->second >= 3) {
// res = (int)it->first.length();
// break;
// }
}
return res;
}
int32_t main() {
string input{"abcdef"};
cout << maximumLength(input) << endl;
return 0;
}
标准输出:
a
ab
abc
abcd
abcde
abcdef
[msi] = [{("a",1),("ab",1),("abc",1),("abcd",1),("abcde",1),("abcdef",1)}]
b
bc
bcd
bcde
bcdef
[msi] = [{("a",2),("ab",2),("abc",2),("abcd",2),("abcde",2),("abcdef",1)}]
c
cd
cde
cdef
[msi] = [{("a",3),("ab",3),("abc",3),("abcd",3),("abcde",2),("abcdef",1)}]
d
de
def
[msi] = [{("a",4),("ab",4),("abc",4),("abcd",3),("abcde",2),("abcdef",1)}]
e
ef
[msi] = [{("a",5),("ab",5),("abc",4),("abcd",3),("abcde",2),("abcdef",1)}]
f
[msi] = [{("a",6),("ab",5),("abc",4),("abcd",3),("abcde",2),("abcdef",1)}]
abcdef 1
abcde 2
abcd 3
abc 4
ab 5
a 6
-1
我的弦上不可能有 6 个 a。所以我想知道哪里出了问题。如果我删除 comp 函数,它的行为将按预期进行。我正在使用 c++ 23 (leetcode 默认)。尝试在 C++14 及以上版本上运行,同样的问题。
您的代码按预期工作 - 您的比较器(仅)根据长度比较字符串,因此无论字符串内容如何,任何两个相同长度的字符串都将比较相等。
因此,您的映射最终会保存具有给定长度的任何字符串的出现次数,其中存储的键只是看到的该长度的第一个字符串。 您有 6 个长度为 1 的字符串,其中第一个是
"a"
,因此您得到的计数为 6。 同样,您有 5 个长度为 2 的字符串,其中第一个是 "ab"
。