2015-01-02 30 views
0

James发现他的朋友Harry写给他女朋友的情书。詹姆斯是个恶作剧,所以他决定干这封信。他将信中的所有单词改为回文。制作一个字符串Palindrome in C

要做到这一点,他遵循的规则2:

(a)他可以减少一个字母,例如价值他可以将'd'改为'c',但他不能将'c'改为'd'。 (b)为了形成回文,如果他不得不重复降低一个字母的价值,他可以这样做,直到字母变成'a'。一封信改为'a'后,就不能再改变了。

每个字母的值的减少都被计为一次操作。查找将给定字符串转换为回文所需的最少操作次数。输入格式 第一行包含一个整数T,即测试用例的数量。 下一个T行将包含每个字符串。这些字符串不包含任何空格。

输出格式 单行包含对应于每个测试用例的最小操作数。

限制条件 1≤T≤10 1≤字符串长度≤104 所有字符均为小写英文字母。

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

int main() { 

    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
    int count; 
    int result; 
    int i,j; 

    scanf("%d",&count); 

    for (i = 0 ; i < count ; i++){ 

     result = 0; 

     char * string; 
     scanf("%ms",&string); 

     int k = (int)strlen(string); 

     printf("Length: %d\n",k); 

     int l = k/2; 

     printf("L is: %d\n",l); 

     for (j = 0 ; j < l ; j++){ 

      printf("first char is is: %c\n",string[j]); 
      printf("Second char is is: %c\n",string[k-j-1]); 
      printf("Current loop count: %d\n",j); 

      if (string[j] != string [k-j]){ 

       int g = (int)(string[j] - string[k-j-1]); 
       if (g > 0){ 
        result += g; 
       } 
       else{ 
        result -= g; 
       } 

      } 
      else; 

     } 

     printf("%d\n",result); 

    } 
    return 0; 
} 

采样输入#00

4 
abc 
abcba 
abcd 
cba 

样本输出#00

2 
0 
4 
2 

说明

对于第一个试验的情况下,ABC - > ABB - > ABA。 对于第二个测试用例,abcba已经是回文串。 对于第三个测试用例,abcd - > abcc - > abcb - > abca = abca - > abba。 对于第四个测试用例,cba - > bba - > aba。

上述代码适用于给定的样本输入,但根据hacckerrank它不是正确的。有人可以指出错误吗?

+0

您从未初始化变量'string'。 – Barmar

+0

@Barmar'scanf(“%ms”,&string);'。然而,如果'scanf()'失败了,那么它的另一个故事。 –

+0

这不会为字符串分配空间。 'string'指向内存中的一些随机地址。 – Barmar

回答

1

的错误是在这里:

if (string[j] != string [k-j]){ 

第二个字符应string[k-j-1]。例如,当j = 0时,您应该与string[k-1]比较字符串的第一个和最后一个字符。

此外,你有内存泄漏。在外部循环的底部你应该这样做:

free(string); 
+0

该死的!我知道我会犯这样的错误..我被困在这里,谢谢你的帮助。 – Quicksillver

-1

我已经解决了这个问题,正确的代码在下面给出。代码的复杂度是O(n * t),其中n是字符串的长度,t是测试用例的数量。

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 


int main() { 
    int t; 
    cin>>t; 
    while(t--){ 
     string s; 
     cin>>s; 
     int count=0; 
     int len=s.length(); 
     for(int i=0;i<len/2;i++){ 
      count+=abs(s[i]-s[len-i-1]); 
     } 
     cout<<count<<"\n"; 
    } 
    return 0; 
} 
+0

**我可否知道downvote的原因。代码工作正常,我已经在hackerrank上获得了相同代码的20分,并且它轻松地通过了所有测试用例。** – amanagg1204