##力扣
###P3无重复字符的最长子串
思路一
不完全正确
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
class Solution {
public:
int lengthOfLongestSubstring(string s) {
string sub;
char c;
int counter=0;
for(int j=0;j<s.length();j++)
{
int place=sub.find(s[j]);
if(place==string::npos)//没有找到
{
sub+=s[j];
}
else
{
sub=sub.substr(place+1);
}
counter=max(counter,sub.length());
}
return counter;
}
};
-
string中有查找函数
find()
,会返回字符找到的下标,若没有找到,会返回string::npos
(一个很大的常数),可以用这个来判断是否存在字符 -
substr(pos,len)
pos为第一个字符的下标,len为子字符串的长度。这两个参数都有默认参数,
pos
为0,len
为string::npos
。若pos
超过string,则抛出异常,若pos+len
超过string,则会只拷贝到string的末尾。
####思路二
- 用哈希表,因为只用增删找查。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(int(s.length())==1)
{
return 1;
}
else if(s.length()==0)
{
return 0;
}
else
{
unordered_set<char> sub;
int ans=1;
char *begin=&s[0];
char *end=begin;
sub.insert(*begin);//插入第一个字符
while(*(end+1)!='\0')
{
if(sub.find(*(end+1))==sub.end())//如果下一个字符没有重复
{
++end;
sub.insert(*(end));//插入新字符
ans=max(ans,int(end-begin+1));
}
else//如果有重复
{
if(begin==end)//只有一个字符
{
++end;
++begin;
}
else//多个字符
{
sub.erase(*begin);
++begin;
}
}
}
return ans;
}
}
};
-
小心特殊元素,0,1 字符串为空。
-
可以用
sub.count(key)
来判断元素存不存在 -
从
rk=-1
开始,然后用rk+1
的值进行判断,可以避免头部的一些问题。
###P5最长回文子串
pair<int,int>
可以用来接受两个函数返回值
#include<utility> using namespace std; pair<int,int> person() { return {1,1}; }
##错题本 ###样例
- 小心特殊元素,0,1 字符串为空。
- 完全相同
###代码细节
string::length()
与string::size()
的数据类型是unsigned int
无符号整型,所以与负数比较时会出问题。可以使用int强转来解决。