无重复字符的最长子串

题目描述:

给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。

代码块

代码块语法遵循标准markdown代码,例如:

int lengthOfLongestSubstring(string s) {
        string smax;
        if(!s.empty()){
            string stemp;
            char* cn=nullptr ;
            const char* constc=nullptr ;         //初始化const char*类型,并赋值为空
            constc= s.c_str();                 //string类型转const char*类型
            cn= const_cast<char*>(constc);
            stemp+=*cn;
            smax=stemp;
            cn++;
            string::size_type idx;
            while(*cn!='\0'){
                idx=stemp.find(*cn);
                if(idx == string::npos){
                    stemp+=*cn;
                }
                else{
                    string temp=stemp.substr(idx+1);
                    stemp.clear();
                    stemp=temp;
                    stemp+=*cn;
                }
                if(stemp.size()>smax.size()){
                    smax=stemp;
                }
                cn++;
            }
        }
        return smax.size();
    }

遇到的问题及解决方案:

由于好久没用c++,忘记了许多函数和写作规范。

  • 字符串(string)转化为char*,一定要先转化为const char*,再强制转化为char ,具体原因请参考 C++中string、char 、char[]的转换.
  • 字符串的find(),如果找到返回索引。否则返回string::npos,其中索引的定义为string::size_type类型(不是int,有的博客写法错误),具体请参考C++ 中string.find() 函数的用法总结.
  • 指针定义需要初始化为nullptr
  • substr(par1,par2)截取从指定索引长度的字串,par1为指定索引,par2为指定长度。
  • 字符串长度的三个函数 .size(),.length(),strlen()
  • 字符串置空 .clear()

算法思想

指针cn依次从字符串开始移动到末尾,设置smax存储当前最大不重复字符串,stemp存储跟随指针移动不重复的字符串。每一步判断stemp>smax,是则赋值。
-(1)判断*cn是否为空,空跳转至(4),否则至(2)
-(2)判断该字符*cn是否存在于stemp,不存在则cn++,继续比较下一个,跳转至(3),比较当前字符串stemp长度是否大于smax;存在则截取存在字符的下一个位置至现在的子字符串,例(abcdef)下一个字符为c,则截取字符串赋值给stemp,跳转至(3)。
-(3) 若stemp.长度大于smax,则smax=stemp.
-(4) 输出smax的长度


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值