滑动窗口
//普通版
class Solution {
public:
//定义len为无重复最长子串长度,l_s为传入字符串的长度,定义str来保存子串。
int lengthOfLongestSubstring(string s) {
int len = 0 ,l_s = s.length();
string str = "";
for (int i = 0; i < l_s; i++)
{//for循环遍历字符串s
int pl = str.find(s[i]);
if (pl == -1)
{
str.append(s,i,1);
//在str子串中查找是否包含当前字符,若不包含则即将字符添加到str末尾
}else{
//若有找到重复,则删除重复字符及以前的字符,在末尾添加该字符
string temp;
temp.append(str,pl+1,str.length()-pl-1);
str = temp;
str.append(s,i,1);
}
if (str.length() > len)
{
//每一次处理完,都进行以此判断,取str当前长度和len的最大值
len = str.length();
}
}
return len;
}
};
// 进阶版
//假设要找的子串为s[start,end),定义len,为所求子串长度,全部初始化为0。
int lengthOfLongestSubstring(string s) {
int len = 0;
int end = 0,start = 0,length = 0;
//直到end成为s的最后一位,将s[end]与之前的每一位比较,如果有重复,将start置为重复字符下标的后一位。统计一次子串长度。
while (end < int(s.size()))
{
char temp = s[end];
for (int i = start; i < end; i++)
{
if (temp == s[i])
{
start = i + 1;
length = end-start;
break;
}
}
end++;
length++;
len = max(len,length);
}
return len;
}
三重for循环
int lengthOfLongestSubstring(string s) {
int len = 0;
int l_s = s.length();
for (int i = 0; i < l_s; i++)
{
for (int j = 1; j < l_s - i+1; j++)
{//使用双重for循环遍历s的所有子串
int flag = 1;//设置flag变量
string str = "";
str.append(s,i,j);//str为获取的子串
for (int k = 0; k < str.length(); k++)
{//再次嵌套for循环对str中的每一个字符做前查和后查操作,若两次差得的结果相等,则说明该字符在str中仅出现了一次
int flag_f = str.find(str[k]);//前查
int flag_e = str.rfind(str[k]);//后查
if (flag_e != flag_f){
flag = 0;
break;
}
}
if (flag == 1 && str.length() > len)
{
len = str.length();
cout << str << endl;
}
}
}
return len;
}