如何提取出一个字符串的所有子串,并且将回文子串输出

首先,我先介绍我的思路:我要想办法找到该字符串所有的子串,然后再进行判断它是否为回文。那么,我们怎么找到字符串的子串呢?
下面,我来介绍一种string类的查找子串的方法:

c1.substr(int pos,int n)/*这里的第一个参数pos默认值为0,第二个参数n表示从pos往后数的n个元素。即表示提取c1字符串里的从pos(可以自由修改参数pos)往后数的n个字符组成的字符串。

我们可以按由短到长的顺序来,即先找到所有两个字符组成的子串,然后枚举到母串长度length;而对于每个字符串的长度,都要从头开始遍历,下面,我们来实现一下:

length=c1.length();
for(i=2;i<=length;i++)
{
	for(beg=0;pos<length-i+1;beg++)
	{
		c2=c1.substr(pos,i);
	}

下面,我们找到了他的子串,那么怎么判断是否为回文呢?(回文就是正着读和反着读是一样的),所以,我们可以先将一个要判断的字符串逆向赋值给另外一个字符串,接着只要判断这两个字符串是否相等即可,这里就体现了用string的方便之处。
最后,我们来进行总的合并,代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string c1,c2,c3;  //我们用c1表示母串,c2表示子串,c3承接c2逆向赋值形成的字符串
	getline(cin,c1);  //对c1进行赋值
	int length1=c1.length();
	int length2,i,pos,n;   //length1用来表示母串的长度,length2用来表示子串的长度,pos表示每个子串从哪里开始找。
	for(n=2;n<=length1;n++)  //从2到length枚举
	{
		for(pos=0;pos<length1-n+1;pos++)
		{
			c2=c1.substr(pos,n);  //找到子串并给c2
			length2=c2.length();  //计算找到的子串的长度
			c3=c2;  //先将c2给c3,至于为什么要这样做我也解释不清,但如果缺少这步,c3将会赋值失败,读者可以试试。
			for(i=0;i<length2;i++)
			{
				c3[i]=c2[length2-i-1];  //将找到的子串c2逆向给c3
			}
			if(c2==c3)   cout<<c2<<endl;
		}
	}
	return 0;

以上,就是解决该问题的所有代码,因为我是大一新生,刚接触计算机三个月,所以有错的话,多多包涵!希望大家可以多提出一些宝贵意见。

发布了7 篇原创文章 · 获赞 0 · 访问量 223

猜你喜欢

转载自blog.csdn.net/TpeterH/article/details/103810980