##力扣

###P3无重复字符的最长子串

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,lenstring::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强转来解决。