Palindrome Index(回文字符串)

C++字符串长度获取函数以及其区别:
(C/C++ strlen(str)和str.length()和str.size()都可以求字符串长度。
其中str.length()和str.size()是用于求string类对象的成员函数 strlen(str)是用于求字符数组的长度,其参数是char*。)
Probelm: 给你一个仅由小写字母组成的字符串。你的任务是找出一个位置,删掉那个字母之后,字符串变成回文的。总会有一个合法的解。如果给定的字符串是一个回文串,那么
-1也将被当作其中一个合法的解。 输入格式 第一行包含T,测试数据的组数。 后面跟有T行,每行包含一个字符串。 输出格式 如果可以删去一个字母使它变成回文串,则输出任意一个满足条件的删去字母的位置(下标从0开始)。例如: bcbc 我们可以删掉位置0的b字符,或者位置3的c字符。两个答案都是正确的。 约束条件 1 ≤ T ≤ 20 1 ≤ 字符串的长度 ≤ 100005 所有字符都是小写字母 输入样例 #00 3 aaab baa aaa 输出样例 #00 3 0 -1 解释 在给定的输入中,T =3 +对于输入aaab,我们可以发现删掉字母b可以使得原串变为回文串,因此输出位置3。
+对于输入baa,我们可以发现删掉字母b可以使得原串变为
回文串,因此输出位置0。 +对于输入aaa,我们发现它已经是回文串了,所以输出-1

 

#include <bits/stdc++.h>

using namespace std;

bool palindrome(string s,int first,int last){
    while(first<last){
        if(s[first] == s[last])
        {
            first++;
            last--;
        }else{
            break;
        }
    }
    if(first >= last){
        return true;
    }
    else
        return false;
}
int palindromeIndex(string s){
    // Complete this function
    int len = s.length() ;
  
    int resultIndex = -1;
    int firstIndex = 0;
    int lastIndex = len-1;
    while(firstIndex < lastIndex){
        if(s[firstIndex] == s[lastIndex]){
            firstIndex++;
            lastIndex--;
        }
        else{
            break;
        }
    }
    if(firstIndex >= lastIndex){
        resultIndex = -1;
    }
    else{
        if(palindrome(s,firstIndex+1,lastIndex))
        {
            resultIndex = firstIndex;
        }
        else if(palindrome(s,firstIndex,lastIndex-1))
        {
            resultIndex = lastIndex;
        }
    }
    return resultIndex;
}

int main() {
    int q;
    cin >> q;
    for(int a0 = 0; a0 < q; a0++){
        string s;
        cin >> s;
        int result = palindromeIndex(s);
        cout << result << endl;
    }
    return 0;
}

 

posted @ 2018-02-28 09:51  mysunicey  阅读(285)  评论(0编辑  收藏  举报