AcWing-最长公共字符串后缀

博客围绕用C++求解若干字符串的最长公共后缀问题展开。先给出问题描述、输入输出格式及数据范围和样例。解题思路是反转字符串求最长公共前缀子串,包括读入数据、字符串反转、排序、倒序输出等步骤,最后给出完整代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

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

输入格式

由若干组输入组成。
每组输入的第一行是一个整数N。
N为0时表示输入结束,否则后面会继续有N行输入,每行是一个字符串(字符串内不含空白符)。
每个字符串的长度不超过200。

输出格式

共一行,为N个字符串的最长公共后缀(可能为空)。

数据范围

1≤N≤200

样例输入

3
baba
aba
cba
2
aa
cc
2
aa
a
0

样例输出

ba

a

【解题思路】

反转求最长公共前缀子串,按照字典序排序,对比 a[0]a[n - 1] 的公共前缀并倒序输出。

1.读入数据

while (cin >> n , n) //n为0时结束输入

2.字符串反转

reverse(a[i].begin() , s.end());

3.排序

sort(a , a + n); //对于字符串数组,sort默认按字典顺序

4.倒序输出

string res = " "; //定义空字符串用来存放公共子串
for(int i = 0; i < len; i ++)
   {
     if(a[0][i] == a[n - 1][i])  
        res = a[0][i] + res; //倒序存放
     else   
        break;
   }
cout << res << endl;

5.完整代码

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

string a[210];

int main()
{
    int n;
    while (cin >> n , n)
    {
        for (int i = 0; i < n; i ++)
        {
            cin >> a[i];
            reverse(a[i].begin() , a[i].end());
        }
        sort(a , a + n);
        int len = a[0].size();
        string res = " ";
        for (int i = 0; i < len; i ++)
        {
            if(a[0][i] == a[n - 1][i])  
               res = a[0][i] + res;
            else   
               break;
        }
        cout << res << endl;
    }
    return 0;
}
### 关于KMP算法AcWing平台的相关内容 #### KMP算法简介 KMP算法是一种高效的字符串匹配算法,能够在线性时间内完成模式串在文本串中的查找操作。该算法的关键在于`next`数组(有时也称为`ne`数组)的构建,这使得当发生不匹配时不需要回溯文本指针,而是利用已经匹配的信息来调整模式串的位置[^1]。 #### next数组的作用与计算 `next`数组记录了对于模式串中每一个位置而言最长相等前缀和后缀的长度。这种特性允许KMP算法在遇到失配情况时不需重新比较已知匹配过的字符序列,从而提高了效率。具体来说,在每次失配之后,不是简单地将模式串向右滑动一位,而是依据`next`数组指示的新起始点继续尝试匹配[^2]。 #### 实现细节 以下是基于Python编写的简化版KMP算法实现: ```python def kmp_search(text, pattern): n = len(text) m = len(pattern) # 构建next数组 next_array = [0] * m j = 0 for i in range(1, m): while j and pattern[i] != pattern[j]: j = next_array[j - 1] if pattern[i] == pattern[j]: j += 1 next_array[i] = j # 开始匹配过程 matches = [] j = 0 for i in range(n): while j and text[i] != pattern[j]: j = next_array[j - 1] if text[i] == pattern[j]: j += 1 if j == m: matches.append(i - m + 1) j = next_array[j - 1] return matches ``` 此代码片段展示了如何创建并运用`next`数组来进行高效字符串匹配[^3]。 #### 应用实例 除了基本的功能外,KMP还可以应用于更复杂的场景,比如边界条件处理等问题上。例如,在某些情况下可能需要考虑匹配成功的精确位置,并据此做出相应调整,如更新特定索引处的状态变量等[^4]。 #### 学习资源推荐 针对希望深入学习KMP算法及其应用的学习者,AcWing平台上提供了丰富的教程资料、练习题库以及社区讨论区供参考。这些资源不仅有助于理解理论概念,还能通过实际编程实践巩固所学知识点[^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值