适用情况:
①题目中出现最短,最长
②出现子串、子数组、子数列
给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
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对应元素,更新当前result
while("result不满足要求"){
窗口缩小,移除left对应元素,left右移
}
更新最优结果bestResult
right++;
}
返回bestResult
滑动窗口的最短子串模板
初始化 left,right,result,bestResult
while("右指针没有到结尾"){
窗口扩大,加入right对应元素,更新当前result
while("result满足要求"){
更新最优结果bestResult
窗口缩小,移除left对应元素,left右移
}
right++;
}
返回bestResult