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;//输出最后的字串
}
}
点个👍吧,秋梨膏!!