【题解】回文数索引
回文数索引
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不相等,所以需要去掉倒数第二个字符。
总结一下就是,如果,那么判断
- 如果s[i+1] == s[s.length-1-i]那么去掉前面的(i)
- 如果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; }