【题解】回文数索引

回文数索引

http://www.nowcoder.com/questionTerminal/b6edb5ca15d34b1eb42e4725a3c68eba

题目描述

给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。

输入描述:

第一行包含T,测试数据的组数。后面跟有T行,每行包含一个字符串。

输出描述:

如果可以删去一个字母使它变成回文串,则输出任意一个满足条件的删去字母的位置(下标从0开始)。例如:
bcc
我们可以删掉位置0的b字符。
示例1
输入

3
aaab
baa
aaa

输出

3
0
-1

回文数字符串的性质:对 来说,(第i个和倒数第i个相等)
这道题目可以将原字符串里的每对字符依次拿出来比较,如果遇到不同的,就一定是在这对字符附近删除一个,
举个例子,对于字符串 来说
第一对,s和s相等
第二对,f和t,不相等,所以这道题目的答案一定是去掉f或者是去掉t中的一个,接下来的判断就是去掉哪一个的问题了。如果去掉倒数第二个字符t,那么倒数第3个字符f变成了倒数第二个。和第二个f相等。如果去掉f,第三个字符u变成第二个。和t不相等,所以需要去掉倒数第二个字符。
总结一下就是,如果,那么判断

  1. 如果s[i+1] == s[s.length-1-i]那么去掉前面的(i)
  2. 如果s[i] == s[s.length-1-i-1]那么去掉后面的(s.length-1-i)
#include<iostream>

using namespace std;

int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        string s;
        cin >> s;
        int len = s.length();
        int ans = -1;
        for(int i = 0 ;i < len/2 ; i++)
        {
            int j = len-1-i;
            if(s[i]!=s[j])
            {
                if(s[i+1]==s[j])//判断是否要去掉i
                {
                    ans = i;
                }
                else if(s[i]==s[j-1])//判断是否要去掉s.length-1-i
                {
                    ans = j;
                }
                break;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
全部评论

相关推荐

11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务