判断回文的方法总结
1、数字判断法(仅针对数字):
利用取余运算来反转数字,再与原数字进行比较,当数值较大时效率较低
void huiwen(int i)
{
int y=i,num=0;
while(y!=0)
{
num=num*10+y%10;
y/=10;
}
if(num==i) cout<<num<<endl;
}
2、全部/半部反转判断:
对于数字和字符串皆可(若输入的是整型的数字,则可以通过stringstream来将其转换成字符串),利用函数reverse()函数
①可以将整个字符串进行反转再比较
bool huiwen(string str)
{
string temp;
temp=new StringBuffer(str).reverse().toString();
if(str==temp) return true;
else return false;
}
②可以将后半部分的字符串进行反转与前半部分进行比较(必须直到回文分段点在哪里)
bool huiwen(string n)
{//假设字符串的长度为8
string p1=n.substr(0,4);
string p2=n.substr(4,4);
reverse(p2.begin(),p2.end());
if(p1==p2) return true;
else return false;
}
3、利用栈(先入后出)结构进行逆序:
#include<bits/stdc++.h>
using namespace std;
int a[9999];
int n;
stack < int > q;//定义一个栈结构 让整个数组逆序输出
class heat
{
public:
void ruzhan()//入栈操作,利用栈的先进后出的特性,可以使用户给定的一串数字逆序输出
{
int i=0;
for(i=0;i<n;i++)
q.push(a[i]);
}
public:
bool hexin()//核心代码:利用回文结构的性质,一串数字(字符串)正序和逆序完全一样,就说明是回文结构
{
for(int i=0;i<n;i++)
{
if(a[i]!=q.top())//正常访问数组是正序,通过栈访问是逆序,只要正序和逆序有一个数字不同,直接返回false
return false;
q.pop();
}
return true;//全部一样 返回true
}
};
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
heat p;
p.ruzhan();
cout<<p.hexin()<<endl;
}
4、动态规划回文问题: