string字符集

思路:用分割的方法,标记不在字符集的字母的序号。但是我一开始的代码有错误

原始代码:

复制代码
#include<stdio.h>
#include<string.h>
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		char s1[10005],s2[27];
		scanf("%s",s1);
		scanf("%s",s2);
		char zm[27];
		for(int i=0;i<26;i++){
			zm[i]='a'+i;
		}
		//标记
		int t[27]={0};
		for(int i=0;i<strlen(s2);i++){
			for(int j=0;j<26;j++){
				if(s2[i]==zm[j]){
					t[j]=1;
				}
			}
		}
		//找出不在字母集的字母的序号
		int cnt=0,xvhao[10005]={0};
		for(int i=0;i<strlen(s1);i++){
			for(int j=0;j<26;j++){
				if(s1[i]==zm[j]&&t[j]==0){
					xvhao[cnt]=i;
					cnt++;
				}
			}
		}
		int end=xvhao[0];
		for(int i=1;i<cnt;i++){
			int temp=xvhao[i]-xvhao[i-1]-1;
			if(temp>end) end=temp;
		}
		int d=strlen(s1);
		if(cnt==0) printf("%d\n",d);
		else if(cnt==1){
			if(xvhao[0]==0){
				int x1=strlen(s1)-1;
				printf("%d\n",x1);}
			else {
				int x=strlen(s1)-cnt-1;
			    if(cnt>x){
				    printf("%d\n",cnt);
			    }
			else printf("%d\n",x);
		    }
		}
		else 
			printf("%d\n",end);
		
	}
}

错误在于:

当 cnt == 1 时,原代码逻辑错误,现在统一按照"计算分割点前后及中间子串长度,取最大值"的逻辑处理,不再单独处理 cnt == 1 的情况,使逻辑更清晰且正确。

◦分别计算第一个分割点之前、中间分割点之间、最后一个分割点之后的子串长度,确保所有可能的子串都被考虑到。

AC代码

复制代码
#include<stdio.h>
#include<string.h>
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        char s1[10005],s2[27];
        scanf("%s",s1);
        scanf("%s",s2);
        char zm[27];
        for(int i=0;i<26;i++){
            zm[i]='a'+i;
        }
        // 标记字符集s2中包含的字母
        int t[27]={0};
        for(int i=0;i<strlen(s2);i++){
            for(int j=0;j<26;j++){
                if(s2[i]==zm[j]){
                    t[j]=1;
                }
            }
        }
        // 找出s1中不在字符集s2的字母的序号
        int cnt=0,xvhao[10005]={0};
        for(int i=0;i<strlen(s1);i++){
            for(int j=0;j<26;j++){
                if(s1[i]==zm[j]&&t[j]==0){
                    xvhao[cnt]=i;
                    cnt++;
                }
            }
        }
        int max_len = 0;
        // 处理没有不在字符集内的字符的情况
        if(cnt==0) {
            max_len = strlen(s1);
        }
        // 处理有至少一个不在字符集内的字符的情况
        else {
            // 计算第一个分割点之前的子串长度
            int first_len = xvhao[0] - 0;
            max_len = first_len;
            // 计算中间分割点之间的子串长度
            for(int i=1;i<cnt;i++){
                int temp = xvhao[i]-xvhao[i-1]-1;
                if(temp>max_len) {
                    max_len = temp;
                }
            }
            // 计算最后一个分割点之后的子串长度
            int last_len = strlen(s1) - 1 - xvhao[cnt - 1];
            if(last_len>max_len) {
                max_len = last_len;
            }
        }
        printf("%d\n",max_len);
    }
    return 0;
}

整体思路:(ai生成

◦ 首先标记字符集 s2 中包含的字母。

◦ 然后找出字符串 s1 中所有"不在 s2 字符集内"的字符的位置,这些位置作为分割点。

◦ 最后计算被分割点分割后的各个子串的长度,取最大值作为结果。

相关推荐
Raas1003 分钟前
AI网关能做语义缓存吗?MAI Gateway(魔芋企业级AI网关)实战能力深度解读
java·后端·spring
weixin199701080165 分钟前
《1688消息服务落地方案:alibaba.message.* 与 Webhook 回调的可靠性与重试策略》(附Python源码)
开发语言·python
天空鸟_时光不老10 分钟前
13-亮点提炼:把技术说辞翻译成业务价值
java·spring boot·spring·spring cloud·mybatis
小蒜学长14 分钟前
基于SpringBoot+Vue的租房管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·租房管理
ZHOUPUYU15 分钟前
PHP 9.0 前瞻:下一代 PHP 会带来哪些新功能?
android·开发语言·php
某不知名網友15 分钟前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++
C++ 老炮儿的技术栈16 分钟前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
洋就在江州20 分钟前
gitlab-cicd 离线集成——springboot-cicd (非docker形式,shell形式)
java·spring boot·后端·ci/cd·gitlab·gitlab-runner
CEZ27 分钟前
JeeWMS 开源 WMS 全景导览:一套 Java 仓库管理系统从单据流到代码入口的阅读地图
java·开源
Nebula_g27 分钟前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈