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?
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);