本题为笔试真题。
一、描述
给定一个字符串,从中任意删除一个字符,判断该字符是否为回文串。
回文串:从左至右与从右至左遍历得到的串为相同串。
如:
输入abccba,
abccba删除第一个c后得到abcba,
这是回文串,则输出;
若不是回文串,则输出false。
二、思路
写了三个主要逻辑函数:
首先需要一个函数来逆转字符串;
需要一个函数来判断是否为回文串;
还需要一个函数删除字符串的某个位置的字符。
具体看代码实现——
三、代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int getLength(string s)
{
int length = 0;
for (string::iterator it = s.begin(); it != s.end(); it++)
{
length++;
}
return length;
}
string reverseS(string s)
{
string dest;
for (int i = getLength(s) - 1; i >= 0; i--)
{
dest += s[i];
}
return dest;
}
bool isRe(string s)
{
int length = getLength(s);
//偶数
if (getLength(s) % 2 == 0)
{
string left = s.substr(0, length / 2);
string right = s.substr(length/2);
string releft = reverseS(left);
if (releft == right)
{
return true;
}
else
{
return false;
}
}
//奇数
else
{
string left = s.substr(0, length / 2);
string right = s.substr(length/2+1);
string releft = reverseS(left);
if (releft == right)
{
return true;
}
else
{
return false;
}
}
}
string del(string s,int i)
{
int length = getLength(s);
string news;
if (i == 0)
{
news = s.substr(1);
}
else if (i == length - 1)
{
news = s.substr(0, length - 1);
}
else
{
news = s.substr(0, i) + s.substr(i+1);
}
return news;
}
int main()
{
string s;
while (cin >> s)
{
int length = getLength(s);
int flag = false;
for (int i = 0; i < length; i++)
{
string news = del(s, i);
if (isRe(news))
{
cout << news<<endl;
flag = true;
break;
}
}
if (flag == false)
{
cout << "false"<<endl;
}
}
return 0;
}
四、测试