一个回文字符串的例子
回文字符串,从前面看和从后面看都一样的字符串,如aba,abba等,详细的解释,可以百度,这篇博客主要是16年腾讯实习生笔试的一道题:
题目大意:给一个字符串,可以任意去除其中的任意字符,其可以得到的最大的字符串?
自己头脑不够清晰,想了半天,想了一个递归的解决办法:回文字符串的第一个字符为i,i为1——strLen(字符串的长度)任意一个,找出当前第i个字符串相同的最后一个j,然后递归调用字符串(i——j)中间的字符串。
详细的程序如下:
#include<stdio.h>
#include <string>
#include <iostream>
using namespace std;
void findStrHuiwen(string strIn, int staPos, int endPos, int &maxLen, string &strRes);
string chageStr(string strIn);
int main()
{
string strIn;
cin>>strIn;
// string test = chageStr(strIn);
int len = strIn.length();
cout<<len<<endl;
bool state = true;
int i=0;
string strTemp;
string strRes = "";
int maxLen = 0;
findStrHuiwen(strIn, -1, len, maxLen, strRes);
cout<<maxLen<<endl;
return maxLen;
}
void findStrHuiwen(string strIn, int staPos, int endPos, int &maxLen, string &strRes)
{
for (int i=staPos+1;i<endPos;i++)
{
for (int j=endPos-1;j>=i;j--)
{
if (strIn[i]==strIn[j])
{
if ((j-i)>=2)
{
strRes.append(2,strIn[i]);
findStrHuiwen(strIn, i, j, maxLen, strRes);
}
else if ((j-i)==1)
{
strRes.append(2,strIn[i]);
string turnStr = chageStr(strRes);
cout<<turnStr<<'\t'<<strRes.size()<<endl;
if (maxLen<strRes.size())
{
maxLen = strRes.size();
}
strRes = "";
}
else
{
strRes.append(1,strIn[i]);
string turnStr = chageStr(strRes);
cout<<turnStr<<'\t'<<strRes.size()<<endl;
if (maxLen<strRes.size())
{
maxLen = strRes.size();
}
strRes = "";
}
}
}
}
}
string chageStr(string strIn)
{
int strLen = strIn.size();
string str = "";
str.resize(strLen, 0);
for (int i=0;i<strLen/2;i++)
{
str[i] = strIn[2*i];
str[strLen-i-1] = strIn[2*i];
}
if (strLen%2)
{
str[strLen/2] = strIn[strLen-1];
}
return str;
}
测试实例:
如下图:输入字符串acdadc,第二行代表字符串长度,以后输出回文字符串,最后一个输出是最大的回文字符串的长度,即为要求的最终结果。
说明:这个程序并没有经过严格的测试,如果有问题,欢迎网友们批评指正,如果有什么更快速的解法,也请网友不吝赐教。谢谢阅读。