如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了
问题描述:
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是?"wke",所以其长度为 3。
解题思路
1.如图1:初始状态,入参字符串指针s
。字符串指针p
和flag
。计数器sum
。变量maxlong
记录最长的长度,没在图中显示。
2.指针s
每次循环自增,计数器sum=1
。在指针s
的每次循环中,指针flag
记录指针p
的起始位置,p
通过循环每次自增+1,比较与s
位置的值是否相同,不相同计数器+1。p
每次移动到与s
相差1个距离就结束。将sum
与maxLong
相比较,若是比maxLong
大,将值赋给maxLong
。在将p
移动到flag
的位置,准备下一次s
的循环。
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