适用情况:
①题目中出现最短,最长
②出现子串、子数组、子数列
给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
1、 只包含1个字母(a~z, A~Z),其余必须是数字;
2、 字母可以在子串中的任意位置;
如果找不到满足要求的子串,如全是字母或全是数字,则返回-1。
#include<stdio.h>
#define MAXN 10000
int isLetter(char c)
{return ((c>='a'&&c<='z')||(c>='A'&&c<='Z'));
}
int isNumber(char c) {return (c>='0'&&c<='9');
}
int main(){char str[MAXN]={0};scanf("%s",str);char *left=str;char *right=str;int bestresult=0;int result=0;int tag=0;while(*right!='\0'){ //只要右指针没有到字符串尾部while(tag==1&& isLetter(*right)&&left!=right){ //子串不满足要求时(有两个字母)left++; //一直向右移动直到子串满足条件result--;if(isLetter(*(left-1))){ //左指针略过最左边字母后子串满足条件,跳出循环break;}}if(isLetter(*right)){ //为满足子串必须有一个字母的条件tag=1;}right++; result++;if(tag==1&&result>bestresult){ //子串必须含有字母才能满足条件 bestresult=result;}}printf("%d",bestresult);return 0;
}
滑动窗口的最长子串模板
初始化 left,right,result,bestResult
while("右指针没有到结尾"){窗口扩大,加入right对应元素,更新当前resultwhile("result不满足要求"){窗口缩小,移除left对应元素,left右移}更新最优结果bestResultright++;
}
返回bestResult
滑动窗口的最短子串模板
初始化 left,right,result,bestResult
while("右指针没有到结尾"){窗口扩大,加入right对应元素,更新当前resultwhile("result满足要求"){更新最优结果bestResult窗口缩小,移除left对应元素,left右移}right++;
}
返回bestResult