使用滑动窗口求无重复字符最长子串的长度
整体做题思路:
给定一个字符串,要求找出其中不含有重复字符的最长子串的长度。
我们选用两个指针i,j的方法来求出最长子串的长度,指针i指向无重复子串的第一个字符,指针j指向无重复子串的最后一个字符。通过i,j指针的不断改变,来计算子串的长度。
首先,定义一个长度为128的空数组map[128]存储ASSCII值来反映某一个字符是否在子串中出现过,i,j指针都指向字符串的开头元素,通过循环,改变j指向的字符,使用空数组map[s[j]]的取值来判断字符在子串中是否出现过。
若map[s[j]]==0
,表示j指向的字符在子串中没有出现过,则j指针后移,并将map[s[j]]赋值为j+1(原因:当判断出map[s[j]]不为零时,指针i可以直接移动到j+1处,重新计算无重复字符);若map[s[j]]!=0
,表示表示j指向的字符在子串中出现过,此时需要将指针i移动到j+1(即map[s[j]]的值)处。直达指针j指向最后一个字符。
原始代码(错误)
#include<string.h>
#include <stdio.h>
void main()
{
char str[100];
int n=0,i=0;
printf("请输入字符串:");
gets(str);
n=strlen(str);
for(i=0;i<n;i++)
{
printf("%c",str[i]);
}
lengthOfLongestSubstring(str);
}
int lengthOfLongestSubstring(char* s)
{
int map[128]={
0}; //定义一个空数组存储ASSCII值来反映某一个字符是否在子串中出现过&#