给出一个字符串,仅由小写字母组成。请找出是否仅删除其中的一个字母之后, 字符串变成回文串。返回值为删除的字符的索引。如果已经是回文字符串,返回-1 比如 输入 3 aaab baa aaa。 输出 3 0 -1.
思路:既然能通过增加一个字符变成回文串,那一定也可以通过删除一个字符变成回文串。用一个循环,每次循环依次删掉一个字符,然后检查新串是否是回文串,看起来简单方便许多。
代码如下:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <limits>
#include <stdlib.h>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
bool isHuiwen(string s)
{
string str = s;
int length = s.size();
for (size_t i = 0; i < s.length()/2; i++)
{
char temp = s.at(i);
s.at(i) = s.at(s.length() - 1);
s.at(s.length() - 1) = temp;
}
for (size_t i = 0; i < str.length(); i++)
{
if (str.at(i) == s.at(i))
{
continue;
}
else
{
return false;
}
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
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 (size_t m = 0; m < k; m++)
{
if (isHuiwen(vec[m]))
{
vecIndex.push_back(-1);
}
else
{
for (int i = 0; i < vec[m].length(); i++) {
string tmp = vec[m];
for (int j = i; j < vec[m].length(); j++)
{
if (j == vec[m].length()-1)
{
tmp[j] = '\0';
}
else
{
tmp[j] = tmp[j + 1]; // 删掉tmp[j],把后面的向前移动
}
}
tmp.resize(tmp.length() - 1);
if (isHuiwen(tmp))
{
vecIndex.push_back(i);
break;
}
}
}
}
//打印
for (size_t i = 0; i < k; i++)
{
cout << vecIndex[i] << " ";
}
cout << endl;
return 0;
}
输出: