## Hackerrank - Palindrome Index Solution

Given a string of lowercase letters in the range ascii[a-z], determine a character that can be removed to make the string a palindrome. There may be more than one solution, but any will do. For example, if your string is *"bcbc"*, you can either remove *'b'* at index or *'c'* at index . If the word is already a palindrome or there is no solution, return *-1*. Otherwise, return the index of a character to remove.

**Function Description**

Complete the *palindromeIndex* function in the editor below. It must return the index of the character to remove or .

palindromeIndex has the following parameter(s):

*s*: a string to analyze

**Input Format**

The first line contains an integer , the number of queries.

Each of the next lines contains a query string .

**Constraints**

- All characters are in the range ascii[a-z].

**Output Format**

Print an integer denoting the *zero-indexed* position of the character to remove to make a palindrome. If is already a palindrome or no such character exists, print .

**Sample Input**

```
3
aaab
baa
aaa
```

**Sample Output**

```
3
0
-1
```

**Explanation**

*Query 1: "aaab"*

Removing *'b'* at index results in a palindrome, so we print on a new line.

*Query 2: "baa"*

Removing *'b'* at index results in a palindrome, so we print on a new line.

*Query 3: "aaa"*

This string is already a palindrome, so we print . Removing any one of the characters would result in a palindrome, but this test comes first.

** Note:** The custom checker logic for this challenge is available here.

### Solution in Python

```
def palindromeIndex(s):
l = len(s)
i = 0
j = l-1
while i<l:
if s[i]!=s[j]:
break
i+=1
j-=1
if i>j: return -1
a = i+1
b = j
while a<j and b>i+1:
if s[a]!=s[b]:
return j
a+=1
b-=1
return i
for _ in range(int(input())):
print(palindromeIndex(input()))
```

Logic explanation

Let our string be

`s = "babi7loolibab"`

Our code is

```
l = len(s)
i = 0
j = l-1
while i<l:
if s[i]!=s[j]:
break
i+=1
j-=1
if i>j: return -1
```

In the above part we are comparing string from forward to backward, if i becomes greater than j it will simply mean that out string is a palindrome. Therefore we return -1

```
a = i+1
b = j
while a<j and b>i+1:
if s[a]!=s[b]:
return j
a+=1
b-=1
return i
```

But in our example string s = "babi7loolibab" our loop will break when i=4 and j = 8.

It means we have to remove index 4 or index 8.

So we just have to check if s[i+1:8] is a palindrome or not.

If yes we will return i else we will return j

*Alternative solution*

```
def palindromeIndex(s):
for i,j in enumerate(range(0,len(s)//2),1):
if s[-i] == s[j]:
continue
if s[j:-i]==s[j:-i][::-1]:
return len(s)-i
elif s[j+1:-i+1]==s[j+1:-i+1][::-1]:
return j
return -1
return -1
for _ in range(int(input())):
print(palindromeIndex(input()))
```