前言
今天做题做到这道题看到一种很神奇的做法,想写这一篇博客记录一下具体的思路过程
题目描述
我们先来看题目的描述
我们要注意一下这个示例三的描述,题目说的是要求子串,子串在这个原字符串中应该是连续的,所以对于“pwwkew”这个字符串的子串就应该是wke而并非是pwke。
解题思路
这道题我们的解题思路是“移动窗口”的方法,从字符串首个元素开始遍历,当出现重复字符的时候就把起点从首元素改为这个重复字符的位置,并把上一次从开始到找到第一个重复字符时的子串长度,以此类推,每次找到重复的字符就截断,把起点重设并记录该子串长度与前一次的子串长度比较。最后返回最大子串的长度。
变量设置
根据上述的解题思路来设置合适的变量。
result->最长子串长度
tail->存放找到的重复字符后一个元素的地址
head->用来遍历字符串的指针
p->从上一个子串的tail到head遍历判定是否有重复字符
代码分析
先来看代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int lengthOfLongestSubstring(char* s) {
int result = 0;
char* tail = s, * head = s, * p;
while (*head != '\0') {
for (p = tail; p < head; p++) {
if (*p == *head) {
tail = p + 1;
break;
}
}
result = (head - tail + 1) > result ? (head - tail + 1) : result;
head++;
}
return result;
}
int main()
{
char s[] = "abbcdeffff";
int ret = lengthOfLongestSubstring(s);
printf("%d", ret);
return 0;
}
我们通过图来分析
找上述的主体思路遍历完整个字符串即可找出字符串中最长子串的长度,在网上看到有对这种解法一个很形象的比喻:如同一只贪吃蛇(头)与蜥蜴(尾)的组合体,外循环“向前吃”同时计算子串长度,当头遇到天敌(重复字符)时,内循环“断尾求生”(断尾处为子串内重复字符出现处),重复上述过程,直到“吃”完整条字符串!
就以上述代码为例,运行结果如下
这个子串就是bcdef。
以上就是这道题的一整个解法思路以及代码实现了,如有出入,欢迎指正。