C/C++ 最长公共字符串后缀【简单易懂,代码可以直接运行】

C/C++ 最长公共字符串后缀【简单易懂,代码可以直接运行】

给出若干个字符串,输出这些字符串的最长公共后缀。

输入格式
由若干组输入组成。

每组输入的第一行是一个整数 N。

N 为 0 时表示输入结束,否则后面会继续有 N 行输入,每行是一个字符串(字符串内不含空白符)。

每个字符串的长度不超过 200。

输出格式
共一行,为 N 个字符串的最长公共后缀(可能为空)。
在这里插入图片描述
在这里插入图片描述

怎么考虑这个题呢?首先这是一个字符串匹配问题,找最长后缀,所以我们需要从后往前找
这个题的难点
一输入问题:如何输入字符串进行循环比较:这里面用的是while(cin>>n,n)来判断什么时候结束,并设置一个字符串数组,来进行字符串的比较
这里面用到了第一个for循环,第一个for循环的目的是找到你输入的字符串长度的最小值,并且把它设置为len,作为第一次比较的长度
有同学可能会考虑,如果比较之后没有公共后缀怎么办,其实没有相同字符,空格就是公共后缀,会输出空格
二匹配问题,这里面我用到两个for循环和两个flag(标记,因为flag有旗帜的意思,很想标记所以就这样称呼)第一个for循环用来一次遍历该字符数组中存入的所有字符串,第二个字符串用来遍历需要比较的字符串的字符
这个里面是以s[0]为标杆进行比较的,大家可以想一下如果每个字符串都与第1个字符串有相同的后缀,那么这个后缀是他们所有字符串的公共后缀,以此来找到我们要找的公共后缀!
这里面设置了两个flag,第一个success用来标记整体的匹配是否成功,即s[0]与s[1],s[2]等等的整体比较,如果说s[1]都不满足那么s[2]都不会参与比较,s[1]匹配失败则is_name标记true -> false;当此轮匹配结束后,sucess也会变为false执行len–,缩小范围再次进行匹配比较。成功则推出比较循环并输出公共后缀!

代码如下:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	string s[220];
	int i,j,k,n,len;
	//计算出来输入的最小值 
	while(cin>>n,n)
	{
		len = 1000;
		for(i = 0;i < n;i++)
		{
			cin>>s[i];
			if(len > s[i].length()) len = s[i].length();
		}
		while(len)//首先将最小值作为最长后缀进行计算 
		{
			bool success = true;//设置标记判断该len下所有字符串是否匹配,当有一个字符串不匹配时该值即为false 
			for(i = 1;i < n;i++)
			{
				bool is_same = true;//设置标记判断一次比较中字符串是否匹配 
				for(j = 1;j <= len;j++)//从后往前比较len歌字母 
				{
					if(s[0][s[0].length() - j] != s[i][s[i].length() - j])//不等于即不匹配修改标记值 
					{
						is_same = false;
						break;
					}
				}
				if(!is_same)
				{
					success = false;
					break;
				}
			}
			if(success == true) break;//匹配成功退出,否则len-1 
			len -= 1; 
		}
		cout<<s[0].substr(s[0].length() - len)<<endl;//输出最后的字串 
	}
 } 

点个👍吧,秋梨膏!!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henu-于笨笨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值