如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了
问题描述:
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是?"wke",所以其长度为 3。
解题思路
1.如图1:初始状态,入参字符串指针s。字符串指针p和flag。计数器sum。变量maxlong记录最长的长度,没在图中显示。
![图1 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OqhCSrWM-1580868149913)(3-1.png '图1')]](https://img-blog.csdnimg.cn/20200205100249255.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTkzODE4MA==,size_16,color_FFFFFF,t_70)
2.指针s每次循环自增,计数器sum=1。在指针s的每次循环中,指针flag记录指针p的起始位置,p通过循环每次自增+1,比较与s位置的值是否相同,不相同计数器+1。p每次移动到与s相差1个距离就结束。将sum与maxLong相比较,若是比maxLong大,将值赋给maxLong。在将p移动到flag的位置,准备下一次s的循环。
![图2 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-okvVI7Fq-1580868149914)(3-2.png '图2')]](https://img-blog.csdnimg.cn/20200205100307751.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTkzODE4MA==,size_16,color_FFFFFF,t_70)
3.若是在p移动的过程中,p所在位置值与s所在位置的值相同,就将flag移动到p后边的一个位置。并将sum置1。s本次循环结束后,将p移动到flag的位置,准备下一次s的循环。
代码实现
int lengthOfLongestSubstring(char *s) {
int maxLong = 1;
char *p = s;
char *flag = s;
if (*s == '\0')
return 0;
s++;
for (; *s != '\0';) {
int sum = 1;
for (; p != s;) {
if (*p != *s) {
sum++;
p++;
} else {
sum = 1;
p++;
flag = p;
break;
}
}
if (sum > maxLong) {
maxLong = sum;
}
p = flag;
s++;
}
return maxLong;
}
来源:CSDN
作者:###keer###
链接:https://blog.csdn.net/weixin_41938180/article/details/104178845