经典算法 蓝桥杯/ACM 进阶题高级复杂回文串(极简代码,详细思路,一看就会,c++描述)

题目:

字符串中查找最大回文串例:abdfdce,则输出dfdcreade,则输出0(字符串长度<1000)。

思路:

1、两个for循环第一个从前往后扫,第二个从后往前扫。

for (int i = 2; i < str.length() - 2; i++) {
	for (int j = str.length() - 1; j > i; j--) {
	
	}
}

2、两个指针ij分别指向子串首尾,并开始遍历查找,当 s[i]==s[j],并且大于之前子串长度 则进入第三重while循环,下方脑内模拟图,把i,j等指向下标的变量当成下标指针。

for (int i = 2; i < str.length() - 2; i++) {
	for (int j = str.length() - 1; j > i; j--) {
		if (str[i] == str[j] && j - i + 1 > counts) {}
	}
}


3、进入while循环前用n,m替换i,j(避免改变指针下次查找时的位置)开始同时向中间靠拢。
nm全都对应相等,则此子串是回文串并用p,j指向子回文串开始与结束位置。
4、注意一个字符串中可能有多个回文串,则需要一个变量记录回文串长度,当ij指向新子串首尾时,若长度小于原回文串则直接跳过。
5、p,j最后会保存最长的回文串的起始位置与结束位置,最终用循环打印结果即可。

代码:
#include <iostream>
#include <string.h>
int main()
{
	int p, r; // 指针
	int counts = 0; // 长度
	int	key = 0; // 退出判断
	string str; // 字符串与其子回文串

	cin >> str;
	for (int i = 0; i < str.length() - 2; i++)
	{
		for (int j = str.length() - 1; j > i; j--)
		{
			if (str[i] == str[j] && j - i + 1 > counts) // 子串最外层首尾相等,并且长度大于之前的回文子串
			{
				int n = i, m = j;
				while (n < m)
				{
					key = 0;
					n++;
					m--;
					if (str[n] != str[m])
					{
						key = 1;
					}
					if (key)
					{	
						break;
					}
				}
				if (!key)
				{
					counts = j - i + 1;
					p = i, r = j;
				}
			}		
		}
	}
	if (counts != 0)
	{
		for (int i = p; i <= r; i++)
		{
			cout << str[i];
		}
	}
	else
	{
		cout << "0";
	}
	return 0;
}

如果觉得这篇文章对你有帮助的话,不妨点一个赞,十分感谢。
printf(“点个赞吧!”)

你可能感兴趣的:(算法学习笔记,算法,c++,字符串,指针)