Ring与环形文本问题

题目描述
Write a program which finds a pattern p in a ring shaped text s.
输入描述
In the first line, the text s is given.
In the second line, the pattern p is given.
1≤lengthofp≤lengthofs≤100
s and p consists of lower-case letters
输出描述
If p is in s, print ‘Yes’ in a line, otherwise ‘No’.
样例输入 1
knowledgetoadvance
advance
样例输出 1
Yes
代码示例:

#include <iostream>
#include <string>

using namespace std;

// Function to check if pattern p is in ring-shaped text s
bool isPatternInRing(const string& s, const string& p) {
    int n = s.length();
    int m = p.length();
    
    // If length of pattern p is greater than length of text s, return false
    if (m > n) return false;
    
    // Concatenate s with itself to handle circular matching
    string ss = s + s;
    
    // Check if pattern p is in ss using naive pattern matching
    for (int i = 0; i <= 2 * n - m; ++i) {
        int j;
        for (j = 0; j < m; ++j) {
            if (ss[i + j] != p[j])
                break;
        }
        if (j == m) // Found the pattern p in ss
            return true;
    }
    
    return false;
}

int main() {
    string s, p;
    
    // Input the text s and the pattern p
    cin >> s >> p;
    
    // Check if pattern p is in ring-shaped text s
    if (isPatternInRing(s, p)) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
    
    return 0;
}

思路:
理解环形文本匹配:
如果要在环形文本中查找模式 p,我们可以将文本 s 自身连接起来形成一个长字符串 ss = s + s。这样做是为了确保我们可以通过从任何位置开始的子字符串来匹配 p。
使用字符串查找算法:
一旦我们将 s 连接成 ss,我们可以使用标准的字符串查找算法(例如,暴力匹配算法或 KMP 算法),来在 ss 中寻找模式 p。
判断输出:
如果在 ss 中找到了模式 p,则输出 “Yes”,否则输出 “No”。
在解决环形文本中模式匹配的问题时,需要将文本 s 连接成 ss 的主要原因是处理环形性质。

环形文本的问题:

当我们需要在环形文本中查找模式时,例如文本 s = “abcabc” 和模式 p = “abc”,如果只是简单地从头开始匹配,可能会错过环形结构的特性。在这个例子中,p 在 s 中出现了两次,但是如果我们只是从头开始匹配,可能会找不到第二个出现。
解决方法:

为了处理环形结构,我们将文本 s 连接到它自身形成 ss = s + s。这样做的效果是:
如果模式 p 的长度 m 小于文本 s 的长度 n,那么 ss 的长度将是 2 * n。
这样,我们就可以从 ss 的任何位置开始,都能找到环形文本 s 中的所有可能的起始位置,从而保证不会错过任何模式 p 的出现。
为什么要使用 ss 而不是其他方法:

连接文本 s 到 ss 是一种简单而有效的方法来处理环形性质,而不需要特殊的数据结构或算法。一旦连接了 ss,我们可以使用常规的字符串匹配算法(如暴力匹配或 KMP 算法)来解决问题。
这种方法保持了代码的简洁性和可理解性,同时确保了对环形文本的正确处理。
因此,使用 ss 是为了在解决环形文本中模式匹配问题时,能够简单而有效地处理文本的环形性质,以确保能够找到所有可能的模式 p 出现位置。

  • 20
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值