我有试图查找非重复最长字符串的代码。在下面的函数中,我传递字符串,并将第一个字符分配给临时字符串。然后,我逐个字符地遍历原始字符串,看看此字符是否出现在临时字符串中。
为此,我使用string :: find函数并检查std :: String :: npos以确保我没有得到有效的索引。但是我总是得到std :: string :: npos。我不确定这里使用的查找功能出了什么问题
int lcs(string s) {
std::string str;
std::string maxstr;
int max = -1;
str+=s[0];
for(int i = 1 ; i < s.length(); i++)
{
if(str.find(to_string(s[i])) == std::string::npos)
str+=s[i];
else
{
if(str.length() > max)
max = str.length();
maxstr = str;
str.clear();
}
}
return max;
}
int main()
{
int i = lcs("abcabcbb");
return 0;
}
我有一些评论试图删除to_String,因为它正在将ascii值转换为字符串。这是下面的代码,我在尝试std :: to_String之前尝试过,但未按预期提供。
int lcs(string s) {
std::string str;
std::string maxstr;
int max = -1;
str+=s[0];
for(int i = 1 ; i < s.length(); i++)
{
if(str.find(s[i]) == std::string::npos)
str+=s[i];
else
{
if(str.length() > max)
max = str.length();
maxstr = str;
str.clear();
}
}
return max;
}
但是我总是得到std :: string :: npos。我不确定此处使用的查找功能出了什么问题
这里的std::string::find()
没什么问题,错误的是选择一个随机函数并将其放在那里,而又不理解或费心检查它在做什么。这是std::strig::to_string()文档中的报价:
将数值转换为std :: string。
这意味着在结果字符串中,您将获得在s[i]
处具有的字符的数字代码(在您的情况下为ASCII代码)。例如,对于字母“ a”,您将获得字符串“ 97”,而在str
中搜索字符串“ 97”将始终给您负面结果。
但是,如果您查看std::string::find()
文档,则可以看到重载4直接接受字符,即它正在寻找单个字符。因此,如果您改为传递单个字符:
std::string::find()
它应该按预期工作。