(c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度

适用情况:
①题目中出现最短,最长
②出现子串、子数组、子数列

给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:

1、 只包含1个字母(a~z, A~Z),其余必须是数字;

2、 字母可以在子串中的任意位置;

如果找不到满足要求的子串,如果全是数字,则返回-1。

//套用模板
#include<stdio.h>
#define MAXN 10000
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 tag=0;
    while(*right!='\0'){                                       //只要右指针没有到字符串尾部
        while(tag==1&&!isNumber(*right)&&left<right){                   //子串不满足要求时(有两个字母),不满足时才缩小为求最长子串
            left++;                                             //一直向右移动直到子串满足条件
            if(!isNumber(*(left-1))){                            //左指针略过最左边字母后子串满足条件,跳出循环
                break;
            }
        }
        tag= isNumber((*right))?tag:1;
        if(tag==1){
            bestresult=bestresult>(right-left+1)?bestresult:(right-left+1);
        }
        right++;
    }
    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
//学习kmp记录next数组
#include<stdio.h>
#define MAXN 10000
int isNumber(char c) {
    return (c>='0'&&c<='9');
}
int main(){
    char str[MAXN]={0};
    scanf("%s",str);
    char *left=str;
    char *right=str;
    char *next_pos=str;
    int bestresult=0;
    int tag=0;
    while(*right!='\0'){                                       //只要右指针没有到字符串尾部
        if(!isNumber(*right)){
            next_pos=right+1;
        }
        if(tag==1&&!isNumber(*right)) {                   //子串不满足要求时(有两个字母),不满足时才缩小为求最长子串
            left = next_pos;
        }
        tag= isNumber((*right))?tag:1;
        if(tag==1){
            bestresult=bestresult>(right-left+1)?bestresult:(right-left+1);
        }
        right++;
    }
    printf("%d",bestresult);
    return 0;
}

//计算字母左边右边数字之和
#include<stdio.h>
int main(){
    int max=-1;
    int left_sum=0;
    int right_sum=0;
    int len=0;
    char str[1000]={0};
    char *p=str;
    scanf("%s",str);
    while(*p>='0'&&*p<='9'){
        p++;
        left_sum++;
    }
    while(*p!='\0'){
        p++;
        right_sum=0;
        while(*p>'0'&&*p<'9'){
            p++;
            right_sum++;
        }
        len=left_sum+right_sum+1;
        max=(len>max)?len:max;
        left_sum=right_sum;
    }
    printf("%d",max);
    return 0;
}