题目:小易得到了一个仅包含大小写英文字符的字符串,该字符串可能不是回文串。(“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串,”asds”就不是回文串。)小易可以在字符串尾部加入任意数量的任意字符,使其字符串变成回文串。
现请你编写一个程序,程序要能计算出小易可以得到的最短回文串。
个人思路:这个比较简单,我就不过多详细介绍了,主要就是在字符串中找到以最后一个字符为尾部的最长子字符串,该子字符串为回文串。有两个要素:1是要在字符串中找到一个最长的回文串;2是这个回文串是以最后一个字符为结尾。例如“asds”中的最大回文串就是“sds”,找到后就好办了,从这个回文串第一个字符的前一个字符开始,依次将前面的字符复制到整个字符串的尾部,例如“asds”就是把“sds”前面的’a’复制到尾部变成“asdsa”,即为得到的最短回文串。
思路不难想,就是不知道为什么调试了半天,系统还是说只通过了86%的用例,我也是实在没办法了!
代码如下所示:

#include<iostream>
#include<vector>
#include<string>
using namespace std;

int Miroor(string str)
{
	int begin, end, location=0; //定义起始、末尾和定位的变量
	begin = 0;
	end = str.length() - 1;
	while (begin < end) //循环遍历整个字符串
	{
		//如果找到与末尾相等的字符时,将指向末尾的标号往前移,起始标号往后移,
		//同时位置变量加1,表明回文串目前长度加1(此时为假设的可能回文串)
		if (str[begin] == str[end]) 
		{
			begin++;
			end--;
			location++;
			continue;
		}
		//如果begin指向的当前字符不等于end指向的字符且已有假设的回文串时,
		//说明假设的回文串不成立,end要重回末尾,回文串长度也要置0
		if (location >= 1) 
		{
			location = 0;
			end = str.length() - 1;
		}
		//如果没有与尾部的字符相等,就判断从起始位置开始的下一个字符
		begin++;		
	}
	//循环结束后如果回文串长度为0,说明不存在回文串,从倒数第二个字符开始向前全部复制一遍
	if (location == 0) 
		return str.length() - 1;
	else //若有回文串,则返回回文串的第一个字符的位置
		return begin - location;
}

string Soluton(string str)
{
	if (str.length() <= 0)
		return "";
	if (str.length() == 1)
	{
		str.push_back(str[0]);
		return str;
	}
	int begin = Miroor(str); //获取字符串中存在的回文串的第一个字符位置
	while (begin >= 1)
	{
		str.push_back(str[begin - 1]); //从回文串前一个字符开始,依次将前面的字符复制到尾部
		begin--;
	}
	return str;
}

int main()
{
	string str;
	while (cin >> str) {
		int flag = 0;
		for (int i = 0; i < str.length(); ++i) {
			if (str[i]<'A' || str[i]>'z')
			{
				flag = 1;
				break;
			}
		}
		if (flag == 1)
		{
			cout << "" << endl;
			continue;
		}
		cout << Soluton(str) << endl;
	}
	system("pause");
	return 0;
}

在这里插入图片描述


版权声明:本文为weixin_43350361原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_43350361/article/details/107895127