题目描述:
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “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的长度