我干跑了好几次,但找不到错误在哪里。我正在提供我的代码,任何人都可以找出错误吗?

阿里吉特·罗伊

链接https : //www.codechef.com/LRNDSA01/problems/LAPIN

程序描述: Lapindrome 被定义为一个字符串,当在中间分割时,给出两个具有相同字符和每个字符相同频率的一半。如果字符串中有奇数个字符,我们将忽略中间字符并检查 lapindrome。例如,gaga 是一个lapindrome,因为两半ga 和ga 具有相同频率的相同字符。此外,abccab、rotor 和 xyzxy 是一些 lapindromes 的例子。请注意,abbaab 不是跑步机。两半包含相同的字符,但它们的频率不匹配。你的任务很简单。给定一个字符串,你需要判断它是否是一个lapindrome。

我的代码:

 #include <stdio.h>
 #include <string.h>

 int main(){
    
    int i,t,len,j,k,arr_indx,check = 0;
    char s[1000],left[500],right[500];
        
        //s[] = input string
        //left[] = left side of the string after division        
        //right[] = right side of the string after division
        //len = length of the input string
        //arr_index = It is the array index 
  
    scanf("%d",&t);
    for(i = 1;i <= t;i++)
    {
        

        scanf("%s",&s);
        len = strlen(s);
        
        
        //if even length

        if(len % 2 == 0)
        {
            for(j = 0;j < len/2;j++)
                left[j] = s[j];
            left[j] = '\0';
            
            for(k = len/2,arr_indx = 0;k < len;k++,arr_indx++)
                right[arr_indx] = s[k];
            right[arr_indx] = '\0';
        }
        
        //if odd length

        else
        {
            for(j = 0;j < len/2;j++)
                left[j] = s[j];
            left[j] = '\0';
            
            for(k = ((len/2)+1),arr_indx = 0;k < len;k++,arr_indx++)
                right[arr_indx] = s[k];
            right[arr_indx] = '\0';
        }
        
        //Checking

        for(k = 0;k < strlen(left);k++)
            for(j = 0;j < strlen(right);j++)
                if(left[k] == right[j])
                   check++;     

        if(check == strlen(left)) //printing
        printf("YES\n");
        else
        printf("NO\n");
        check = 0;
    }
    return 0;
}
M. Nejat Aydin

您实现的算法既不正确又非常慢(即使它是正确的)。由于输入字符仅限于 a..z,您可以通过比较输入文本左右部分中字母的频率来实现快速算法。下面是一个示例实现。该代码假定 a..z 的字符代码是连续的,C 标准不保证这一点。

#include <stdio.h>
#include <string.h>

#define NLETTERS ('z' - 'a' + 1)

int main(void)
{
    int T;
    
    scanf("%d ", &T);
    while (--T >= 0) {
        char buf[1002];
        int lfreq[NLETTERS] = {0}, rfreq[NLETTERS] = {0}, yes = 1;
        fgets(buf, sizeof buf, stdin);
        for (int i = 0, j = strcspn(buf, "\n") - 1; i < j; ++i, --j) {
            ++lfreq[buf[i] - 'a'];
            ++rfreq[buf[j] - 'a'];
        }
        for (int i = 0; i < NLETTERS; ++i) {
            if (lfreq[i] != rfreq[i]) {
                yes = 0;
                break;
            }
        }
        puts(yes ? "YES" : "NO");
    }
    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章