[编程题]回文数索引
给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。
输入描述:
第一行包含T,测试数据的组数。后面跟有T行,每行包含一个字符串。
输出描述:
如果可以删去一个字母使它变成回文串,则输出任意一个满足条件的删去字母的位置(下标从0开始)。例如: bcc 我们可以删掉位置0的b字符。
输入例子1:
3 aaab baa aaa
输出例子1:
3 0 -1
思路: 1,判断是否存在回文串,如果存在回文子串,不需要删除其中的一个字符;
2.如果不存在回文子串,就需要删除其中的一个字符,让他变成回文;从头遍历字符串,每次只是遍历一个字符并删除,如果删除后回文,就输出下标,如果不是,就重新删除下一个字符,直到所有都有序即可。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <limits>
using namespace std;
inline bool hwjudst(string str)
{
if(str.size()==0){
return false;
}
int start=0;
int end=str.size()-1;
while(start<end){
if(str[start]!=str[end]){
return false;
}
start++;
end--;
}
return true;
}
int erase(string& s)
{
int i;
int j;
if (hwjudst(s)) {
return -1;
}
for (int j = 0; j < s.length(); j++) {
string s1(s);
s1 = s1.erase(j,1);
if (hwjudst(s1)) {
return j;
}
}
}
int main()
{
int t;
cin >> t;
string s;
for (int i = 0; i < t; i++) {
cin >> s;
int res= erase(s);
cout<<res<<endl;
}
return 0;
// int k;
// cin>>k;
// vector<string> vec(k);
// vec.clear();
// for(size_t i=0;i<k;i++){
// string s;
// cin>>s;
// vec.push_back(s);
// }
// vector<int> vecIndex(k);
// vecIndex.clear();
// for(int i=0;i<k;i++){
// cout<<vec[i]<<endl;
// int pos=erase(vec[i]);
// vecIndex.push_back(pos);
// }
// for(int j=0;j<k;j++){
// cout<<vecIndex[j]<<endl;
// }
// return 0;
}