无重复字符串的最长子串
今天做的是查找字符串中不含有重复字符的最长的子串的长度,是对字符串的操作,主要有以下几种方法,参考别人的答案写的,希望自己有一天也可以不用看答案也能自己写出来,加油!
分析这个题目,想要找到相应的子串就必须自己找到他的头和尾,然后记录这个子串的长度,在不断循环中会找到很多个含有不同字符的子串,就需要不断地对比,将比较大的长度数值存入到结果当中就可以得到最终的结果。
首先呢,我们现要定义一些变量,他们分别表示的是子串的头和尾,以及子串的长度和最终结果长度
然后,我们就可以进行循环在整个字符串中寻找相应的子串,在循环过程中头的位置在未遇到相同字符时不会变化,而尾的位置会不断递增,就需要有一个判断来看一下是否我们的当前位置新加入进来的字符与之前所有的字符相同。当然,在相同时,我们应该做的操作是将字符串的起始位置调到发现相同的位置之后一个,然后跳出当前的寻找是否有相同字符的循环
if(temp == s[index]){
start = index + 1;
length = end - start;
break;
}
在判断之外就是不符合条件或者由于发现相同字符之后需要将尾部后移,以及将之前的子串长度与新的子串长度进行比较,可以得到新的最大子串长度;
在这里对长度进行++操作是因为现在的子串是将发现相同字符之前的字符抛弃掉的字符串,是在这个基础上进行的,所以虽然在if语句中对长度进行了操作,在外部还是需要进行++操作,继续对没有遇到相同字符的情况下进行长度加一
end++;
length++;
ans = max(ans,length);
最终的程序如下:
//首先要定义一些变量用来表示不重复字符串的头和尾,以及字符串的长度和最终结果
int start = 0;
int end = 0;
int length = 0;
int ans = 0;
//然后利用循环来查找不重复字符串以及他的长度
while(end < s.size()){
char temp = s[end];
for(int index = start; index < end; index++){
if(temp == s[index]){
start = index + 1;
length = end - start;
break;
}
}
end++;
length++;
ans = max(ans,length);
}
return ans;
另一种方法就是运用哈希表的办法,在运用哈希表的时候跟刚才的逻辑一致,在寻找的过程中将刚刚提取出来的字符与之前放入到表中的字符串进行对比,看是否有相同的还必须是在新的头之后去判断