strlen-ACM简单的字符串匹配,但老是OJ通不过,求大神指点

问题描述

ACM简单的字符串匹配,但老是OJ通不过,求大神指点

Description
给出两个字符串S和T,请判断T是否为S的子串。本题请用"简单匹配法"来做。 使用strstr函数,判cheat

Input
第一行是一个整数N,说明有多少个测试用例。

接下来是N个测试用例,每个测试用例占2行:第一行是字符串S,第二行是字符串T,字符串中不含空格。 1 ≤ strlen(S) , strlen( T ) ≤ 10000

Output
对每个测试用例,输出一行结果:是否子串,是则输出"yes" ,否则输出 "no"

Sample Input
2
aabcdd
abc
aaaaaaaaaaaaa
aaaaaab

Sample Output
yes
no

 #include<stdio.h>
#include<string.h>
int main(void){
int t, j, id, g, d;
char s[10005], c[10005], cha;
scanf("%d", &t);
cha=getchar();
for(g=1; g<=t; g++){
gets(s);     gets(c);  

for(j=0,id=0,d=0; j<strlen(s); j++){
if(s[j]!=c[id])     id=0;
if(s[j]==c[id])     id++;
if(id==strlen(c))      {  d++; break;  }
}

if(d!=0)   printf("yesn");
else       printf("non");
}
return 0;
}

解决方案

for(j=0,id=0,d=0; j<strlen(s); j++){
if(s[j]!=c[id]) id=0;
if(s[j]==c[id]) id++;
if(id==strlen(c)) { d++; break; }
}
你这个算法的逻辑有问题呀,你直接先把长串按步长为1,拆分成子串长度大小的几段字符串,
假如
m=len(longstr); n=len(shortstr)
就是把longstr拆分成 m-n+1 个字符串,然后比较一下就行啦~

你看这样可以不?

解决方案二:

 #include<stdio.h>
#include<string.h>
int main(void)
{
        int t, j, id, g, d;
        char s[10005], c[10005], cha;
        scanf("%d", &t);
        cha=getchar();
        for(g=1; g<=t; g++){
        gets(s);     gets(c);  

        for(j=0,id=0,d=0; j<strlen(s); j++)//strlen()函数执行多次,每次循环结束执行一次,strlen()时间复杂度为O(n)
        {
            if(s[j]!=c[id])     id=0;
            if(s[j]==c[id])     id++;
            if(id==strlen(c))      {  d++; break;  }//strlen()函数执行多次,每次循环结束执行一次
        }

        if(d!=0)   printf("yesn");
        else       printf("non");
}
        return 0;
}

这样的代码会超时。。。
解决方法:

    for(g=1; g<=t; g++)
    {
    gets(s);     gets(c);
    int l1=strlen(s);
    int l2=strlen(c);
    for(j=0,id=0,d=0; j<l1; j++)
    {
            if(s[j]!=c[id])
                            id=0;
                    if(s[j]==c[id])
                                id++;
                if(id==l2)
                        {  d++; break;  }
    }

但这样更好

 #include<stdio.h>
#include<string.h>
char s[10010],t[10010];
int n;
int main()
{
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        gets(s);gets(t);
        if(strstr(s,t))printf("yesn");
        else printf("non");
    }
    return 0;
}

解决方案三:

使用strstr判作弊。
试试这个:

 #include<string.h>
int main(void)
{
    int t, j, id, g, ls, lc;
    char s[10005], c[10005], cha;
    scanf("%d", &t);
    cha=getchar();
    for(g=1; g<=t; g++)
    {
        gets(s);    gets(c);
        ls=strlen(s); lc=strlen(c);
        for(j=0,id=0; j<ls; j++)
        {
            if(s[j]!=c[id])
            {
                id=0;
                j--;
            }
            else
            {
                id++;
                if(id==lc) break;
            }
        }

        if(id==lc)  printf("yesn");
        else       printf("non");
    }
    return 0;
}

解决方案四:

修改了一个错误。

 #include<stdio.h>
#include<string.h>
int main(void)
{
    int t, j, id, g, ls, lc;
    char s[10005], c[10005], cha;
    scanf("%d", &t);
    cha=getchar();
    for(g=1; g<=t; g++)
    {
        gets(s);    gets(c);
        ls=strlen(s); lc=strlen(c);
        for(j=0,id=0; j<ls; j++)
        {
            if(s[j]!=c[id])
            {
                if(id>0) j--;
                id=0;
            }
            else
            {
                id++;
                if(id==lc) break;
            }
        }

        if(id==lc)  printf("yesn");
        else       printf("non");
    }
    return 0;
}

解决方案五:

字符串匹配?模式匹配这是

时间: 2024-10-02 16:25:33

strlen-ACM简单的字符串匹配,但老是OJ通不过,求大神指点的相关文章

hdu1716 排序 oj-HDU 1716排列2 老是PE,跪求大神指点

问题描述 HDU 1716排列2 老是PE,跪求大神指点 #include #include using namespace std; int main(){ int a[4]; int flag=0; while(cin>>a[0]>>a[1]>>a[2]>>a[3]&&a[0]+a[1]+a[2]+a[3]!=0){ sort(a,a+4); int flag2 = 0; do{ if(a[0]==0) continue; static

java-最简单的struts2程序,总是提示404,求大神指点

问题描述 最简单的struts2程序,总是提示404,求大神指点 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd&qu

java-最简单的aop实例,总是报错,求大神指点

问题描述 最简单的aop实例,总是报错,求大神指点 package cn.itcast.service; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; //指明这个类为一个切面 @Asp

c++问题-在acm上刷题老是通不过,求大神指点一二,到底问题出在哪里。不胜感激!!!

问题描述 在acm上刷题老是通不过,求大神指点一二,到底问题出在哪里.不胜感激!!! #include #include using namespace std; int main() { int T; int k,t=0; int i, j, n1, n2; char a[1010], b[1010], c[1015]; string d[20], e[20], f[20]; cin>>T; for(k=1; k<=T; k++) { cin>>a>>b; d[

一段简单的c代码,一直报错,求大神们指点

问题描述 一段简单的c代码,一直报错,求大神们指点 char * reverse_str(char *s){ char *p = s; char *q = s; char temp = 0; while(*q != ''){ q++; } q--;//前一个字符 while(p < q){ temp = *p; *p = *q; *q = temp; p++; q--; } return s; } 调试之后发现是交换那段循环的问题,不知道问题出在哪,求指点! 解决方案 http://codepa

c语言-菜鸟OJ, C语言数简单列求和, 感觉测试没错, 但是wrong answer, 求大神指点

问题描述 菜鸟OJ, C语言数简单列求和, 感觉测试没错, 但是wrong answer, 求大神指点 Description 有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13... 求出这个数列的前n项之和. Input 多测试用例,每个测试用例一行,每行是一个正整数n Output 为每个测试用例单独输出一行:该数列的前n项之和.结果均保留小数点后10位. Sample Input 1 2 3 Sample Output 2.0000000000 3.5000000000

链接数据库老是报数据类型无效……求大神解决……

问题描述 链接数据库老是报数据类型无效--求大神解决-- 链接数据库老是报数据类型无效--求大神解决-- 解决方案 检查下你这个ibatis_bm012_sql.xml的映射关系,以及IbatisDaoImpl类360行的查询语句设置的参数类型,配置和方法调用类型是否一致. 不介意的话,贴出配置文件和这个类的方法,让大家帮忙检查一下. 解决方案二: 你调用的存储过程 错误是你返回的值是无效的. 检查一下你存储过程的输出值得定义 解决方案三: 检查一下你的xml配置文件里面OUT参数的 jdbcT

javascript-JS简单计算器问题 不知道哪错了 求大神指点

问题描述 JS简单计算器问题 不知道哪错了 求大神指点 简易计算<br> function jiSuan(){<br> var num1 = document.getElementById("num1").value*1;<br> var num2 = document.getElementById("num2").value*1;<br> var oper = document.getElementById(&quo

javascript-js怎么获取所选择的答案字符串并传递到后台,菜鸟求大神帮忙

问题描述 js怎么获取所选择的答案字符串并传递到后台,菜鸟求大神帮忙 ! 解决方案 你这个html怎么设计的?每个后面的问题都嵌套在前面一个问题里.也没有id,你这不是自己找麻烦么 解决方案二: 如果不是checkbox而是图片,建议写个隐藏域,选中时给隐藏域赋值,用隐藏域给后台传值 解决方案三: ajax,不过你这个页面代码蛮奇怪的.能加个id么 解决方案四: 源码