检查字符串两端是否存在可逆相等子串


在这个问题中,我们需要找到从字符串开头和结尾开始的最大长度的可逆相等子串。

这个问题非常类似于寻找回文串。我们可以开始遍历字符串,直到开头和结尾的字符匹配。

问题陈述 - 我们给定一个包含 N 个字符的字符串 str。我们需要检查该字符串是否在开头和结尾包含可逆相等子串。如果我们根据给定条件找到子串,则打印最长的子串。否则,在输出中打印“false”。

示例

输入

str = "tutorialsotut"

输出

‘tut’

解释 - “tut” 出现在开头,而 “tut” 的反转出现在结尾。

输入

 str = ‘abcytrfghgyuyjcba’

输出

‘abc’

解释 - 在给定的字符串中,“abc” 出现在开头,“cab” 出现在结尾。

输入

 str = ‘vdfdvcf’

输出

False

解释 - 该字符串不包含任何可逆子串。所以,它打印 false。

方法一

在这种方法中,我们将从开头开始遍历字符串。我们将匹配字符串的开头和结尾的字符。当我们找到不匹配的字符时,我们将停止迭代。

算法

步骤 1 - 将变量 'p' 初始化为 0,将变量 'q' 初始化为字符串长度 - 1。

步骤 2 - 还将变量 'res' 初始化为一个空字符串,用于存储所需的字符串。

步骤 3 - 使用循环进行迭代,直到 'q' 大于或等于 0。

步骤 4 - 如果 s[p] 和 s[q] 字符相等,则将它们附加到 'res' 字符串。同时,将 p 值增加 1,并将 q 值减少 1。

步骤 5 - 如果 s[p] 和 s[q] 不相同,则使用 'break' 关键字中断循环。

步骤 6 - 如果 'res' 字符串的大小等于零,则打印 false。否则,打印 'res' 字符串。

示例

#include <bits/stdc++.h>
using namespace std;
// Check if the string has reversible equal substring at the start and end of a given string
void ReversibleEqual(string s) {
    // Initialize the length and pointer variables
    int len = s.size();
    int p = 0;
    int q = len - 1;
    string res = "";
    // Iterate over the string
    while (q >= 0) {
        // If characters at index p and q are the same
        if (s[p] == s[q]) {
            // append a character to 'res', and modify p and q value
            res += s[p];
            p++;
            q--;
        } else {
            break;
        }
    }
    // If the substring is not present, print False
    if (res.size() == 0)
        cout << "False";
    // print true
    else {
        cout << "True \n"
             << res;
    }
}
int main() {
    string str = "tutorialsotut";
    ReversibleEqual(str);
    return 0;
}

输出

True 
tuto

时间复杂度 - O(N),因为我们使用循环来迭代字符串

空间复杂度 - O(N),因为我们存储可逆字符串。

程序员可以通过直接打印每个字符而不是将其附加到 'res' 字符串来优化上述解决方案。该解决方案方法与检查字符串是否为回文非常相似。

更新于:2023年8月14日

80 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告