简体   繁体   中英

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, eg 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, ie, 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[kj-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);

I have already solved this question and the correct code is given below. The complexity of code is O(n*t) where n is length of string and t is number of test cases

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM