Quicksillver
Quicksillver

Reputation: 307

Make a string Palindrome in C

James found a love letter his friend Harry has written for his girlfriend. James is a prankster, so he decides to meddle with the letter. He changes all the words in the letter into palindromes.

To do this, he follows 2 rules:

(a) He can reduce the value of a letter, e.g. he can change 'd' to 'c', but he cannot change 'c' to 'd'. (b) In order to form a palindrome, if he has to repeatedly reduce the value of a letter, he can do it until the letter becomes 'a'. Once a letter has been changed to 'a', it can no longer be changed.

Each reduction in the value of any letter is counted as a single operation. Find the minimum number of operations required to convert a given string into a palindrome.

Input Format The first line contains an integer T, i.e., the number of test cases. The next T lines will contain a string each. The strings do not contain any spaces.

Output Format A single line containing the number of minimum operations corresponding to each test case.

Constraints 1 ≤ T ≤ 10 1 ≤ length of string ≤ 104 All characters are lower case English letters.

#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;
}

Sample Input #00

4
abc
abcba
abcd
cba

Sample Output #00

2
0
4
2

Explanation

For the first test case, abc -> abb -> aba. For the second test case, abcba is already palindromic string. For the third test case, abcd -> abcc -> abcb -> abca = abca -> abba. For the fourth test case, cba -> bba -> aba.

The above stated code is working for the given sample input, but it is not the correct one according to hacckerrank. Can someone point out the error please?

Upvotes: 1

Views: 7002

Answers (1)

Barmar
Barmar

Reputation: 781726

The error is here:

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

The second character should be string[k-j-1]. For instance, when j = 0, you should compare with string[k-1] to compare the first and last characters of the string.

Also, you have a memory leak. At the bottom of the outer loop you should do:

free(string);

Upvotes: 2

Related Questions