解析:如何利用滑动窗口的方法解决该问题?
创建快慢两个指针进行窗口的框定。
快指针作为单调性的保持指针。第一次进入循环的时候将字符串记录在数组内表示已框定,如何编写如果出现重复则换一个窗口呢?当map又读取到相同字符时,就会出现慢指针的移动现象,慢指针会移动到和快指针同一起点,即开启了一个新的窗口。
int lengthOfLongestSubstring(char * s){
//double node
int max=0;
int map[99999]={0};
int length = strlen(s);
for(int slow=0,fast=0;fast<length;fast++){
map[s[fast]]++;
while(map[s[fast]]>1&&slow<=length){
map[s[slow++]]--;
}
if(fast-slow+1>max)
max=fast-slow+1;
}
return max;
}
解析:如何用滑动窗口作出这一道题。
核心:创建两个字典map,map1存放正确子串与map2进行比较,map2对整条子串进行记录。
第一个循环,用来把子串写入map1,然后进行初步的比对。若两个map一开始的字符都一样,那么可以直接就成了可以返回了。第二个循环,除去开始的几个字母,比对后面的字母。滑动窗口开始启用:走法是边走边判断,左一个去掉,右一个踏下去,是可以保持滑动窗口为length1的。
//judge system
bool equal(char* map1,char* map2){
for(int i=0;i<26;i++){
if(map1[i]!=map2[i])return 0;
}
return 1;
}
bool checkInclusion(char * s1, char * s2){
//create two dictionary
char map1[26] = {0};
char map2[26] = {0};
//get the length
int length1 = strlen(s1),length2 = strlen(s2);
//comparison of the length
if(length1>length2)return 0;
//get the data
for(int i=0;i<length1;i++){
++map1[s1[i]-'a'];
++map2[s2[i]-'a'];
}
if(equal(map1,map2))return 1;
for(int i=length1;i<length2;i++){
++map2[s2[i]-'a'];
--map2[s2[i-length1]-'a'];
if(equal(map1,map2)){
return 1;
}
}
return 0;
}