原题描述:
//给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
//
//
//
//示例 1:
//
//输入: s = "abcabcbb"
// 输出 : 3
// 解释 : 因为无重复字符的最长子串是 "abc",所以其长度为 3。
//
// 示例 2 :
//
// 输入 : s = "bbbbb"
// 输出 : 1
// 解释 : 因为无重复字符的最长子串是 "b",所以其长度为 1。
//
// 示例 3 :
//
// 输入 : s = "pwwkew"
// 输出 : 3
// 解释 : 因为无重复字符的最长子串是 "wke",所以其长度为 3。
// 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
//
// 来源:力扣(LeetCode)
// 链接:https ://leetcode.cn/problems/longest-substring-without-repeating-characters
// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入: s = "abcabcbb"
int left = 0;
int right = 0;
双指指针其实都是指向s[0]
1.当没有重复的时候,right下标往前
2.出现重复的时候该怎么处理。hash思想的利用
a b c a bcbb
^ ^
| |
left right 的位置如下
那么此时为了去掉重复的字符该这么做呢?
left往前走。同时此时记录下重复的字符个数3 a b c
a b c a bcbb
^ ^
| |
left right 的位置如下
此时就没有重复的啦
在如下:
a b b a bcbb
^ ^
| |
left right 位置 出现了重复的
该怎么处理
a b b a bcbb
^^
||
left right
left right 都指向b 此时最大无重复的值是2 a b
主要思想是采用了两个变量来维护窗口
//滑动窗口法自主实现历程 #define _CRT_SECURE_NO_WARNINGS #include#include int main() { char s[10] = "abcabcdef"; int left = 0; int right = 0; int p = 0; int i = 0 , j = 0; int max = 0; //printf("%dn", strlen(s)); for (i = 0; i < strlen(s); i++) { if (left <= right) { p = 0; for (j = left; j < right; j++) { if (s[j] == s[right]) { p = 1; //printf("%c", s[j]); break; } } if (p == 1) { left = j+1; } if (max < (right - left + 1)) { max = right - left + 1; } } right++; } printf("%d", max); return 0; } //力扣源代码实现 int lengthOfLongestSubstring(char * s) { int left = 0; int right = 0; int p = 0; int i = 0, j = 0; int max = 0; //printf("%dn", strlen(s)); for (i = 0; i < strlen(s); i++) { if (left <= right) { p = 0; for (j = left; j < right; j++) { if (s[j] == s[right]) { p = 1; //printf("%c", s[j]); break; } } if (p == 1) { left = j + 1; } if (max < (right - left + 1)) { max = right - left + 1; } } right++; } return max; }



