如何打印句子是pangram与否。我在c中获得Timeout

时间:2015-10-09 08:25:00

标签: c

我必须找到句子是pangram(Pangrams是通过使用字母表的每个字母构造的句子至少一次)或不是

由于超时而终止。为什么我觉得好吗?如何思考工作。我在hackerrank上使用它。吨

请告诉我们用逻辑推理解决什么是更好的方法。这太多了,但PLZ帮助:)。

这是我能做的最好的PLZ帮助我..提前感谢,如果程序中出现重大错误

#include <stdio.h>

int main()
{
    int i,n=0,l;
    char str[1000];

    scanf("%[^\n]%*c",str);

    for(l=65;i<91;l++)
    {
        for(i=0;str[i]!='\0';)
        {
            if(l==str[i]&&l+31==str[i])
            {
               n++;
            }

            if(str[i+1]=='\0')
            {  i=i+2;

            }
            else
            i++;
        }
    }


    if(n==26)
        printf("pangram ");
    else
        printf(" not pangram ");

    return 0;
}

3 个答案:

答案 0 :(得分:1)

修改您的代码如下:

int a[27];count=0;
for(k=0;k<27;k++)
    a[k]=0;
for(i=0;str[i]!='\0';i++)
{
    if(str[i]>96 && str[i]<123)
        a[str[i]-96]++;
    else if(str[i]>64 && str[i]<91)
        a[str[i]-64]++;
}
for(k=1;k<27;k++)
   if(a[k]>0)
      count++;
if(count==26)
    printf("panagram");

答案 1 :(得分:1)

你有错字

for(l=65;i<91;l++)

应该是

for(l=65;l<91;l++)

另一个可以调用UB的问题是代码

if(str[i+1]=='\0')
{
   i=i+2;
   printf(".-----------%d --- %c\n", i, str[i]);
}

请注意for(i=0;str[i]!='\0';)

这意味着每次找到null终结符时都会继续,直到找到"\0\0"的序列。这将导致UB因为str未被引用而且str 1000DELETE n1 FROM dummyuser1 n1, dummyuser1 n2 WHERE n1.id > n2.id and n1.name = n2.name;

答案 2 :(得分:1)

我建议采用更简单快捷的方式

#include <stdio.h>
#include <ctype.h>

int main(void) {
    char str[1000];
    scanf("%s", str);
    int c[26] = {0}, ans = 1;
    for (int i = 0; str[i]; ++i)
        if (isalpha(str[i]))    // Only if alphabet
            c[tolower(str[i]) - 'a']++;
    for (int i = 0; i < 26; ++i)
        if (!c[i]) {    // Break if not pangram
            ans = 0;
            break;
        }
    printf(ans ? "pangram" : "not pangram");
    return 0;
}
  

时间复杂度 O(字符串长度+常量)