6. 火尖枪破回文 - 最长回文子串(中心扩散法)

哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的回文森林,森林中弥漫着神秘的气息。森林的入口处有一块巨大的石碑,上面刻着一行文字:“欲破此林,需以火尖枪之力,破回文之障,寻最长回文子串。”

哪吒定睛一看,石碑上还有一行小字:“字符串"babad"中,最长回文子串为"bab""aba"。”哪吒心中一动,他知道这是一道关于寻找最长回文子串的难题,需要找到一个字符串中最长的正读和反读都相同的子串。

暴力解法:火尖枪的初次尝试

哪吒心想:“要找到最长回文子串,我可以尝试检查每一个可能的子串。”他催动火尖枪,从字符串的每一个位置开始,逐个字符地检查子串是否为回文。每当发现一个回文子串时,他就记录下它的长度。

string longestPalindrome(string s) {
    int n = s.size();
    string longest = "";
    for (int i = 0; i < n; ++i) {
        for (int j = i; j < n; ++j) {
            if (isPalindrome(s, i, j) && j - i + 1 > longest.size()) {
                longest = s.substr(i, j - i + 1);
            }
        }
    }
    return longest;
}

bool isPalindrome(string s, int start, int end) {
    while (start < end) {
        if (s[start] != s[end]) return false;
        start++;
        end--;
    }
    return true;
}

哪吒成功地找到了最长回文子串,但火尖枪的光芒却黯淡了下来。他意识到,这种方法虽然可行,但效率低下,尤其是当字符串很长时,灵力消耗巨大。

C++语法点:字符串操作

在C++中,字符串操作是处理字符问题的常用工具。以下是一些重要特性:

  • 字符串
    • string是C++中用于存储字符序列的动态数组。
    • 常用方法:
      • size():返回字符串的长度。
      • substr(start, length):返回从start开始的子字符串,长度为length
      • []操作符:通过索引访问字符串中的字符。

高阶优化:火尖枪的中心扩散法

哪吒元神中突然浮现金色铭文——「火尖枪破,中心扩散显神通」。他意识到,可以通过中心扩散法,从每一个字符(或两个字符之间)开始,向两边扩散,寻找最长的回文子串。

哪吒催动火尖枪,从每一个可能的中心点开始,向两边扩散。每当发现一个回文子串时,他就记录下它的长度。通过这种方式,他成功地找到了最长回文子串,而且灵力消耗大幅减少。

开始
遍历每个中心点
从中心向两边扩散
是否为回文
记录最长回文
停止扩散
string longestPalindrome(string s) {
    int n = s.size();
    if (n < 2) return s;

    string longest = "";
    for (int i = 0; i < n; ++i) {
        // 单个字符为中心
        string palindrome1 = expandAroundCenter(s, i, i);
        // 两个字符为中心
        string palindrome2 = expandAroundCenter(s, i, i + 1);

        if (palindrome1.size() > longest.size()) longest = palindrome1;
        if (palindrome2.size() > longest.size()) longest = palindrome2;
    }
    return longest;
}

string expandAroundCenter(string s, int left, int right) {
    while (left >= 0 && right < s.size() && s[left] == s[right]) {
        left--;
        right++;
    }
    return s.substr(left + 1, right - left - 1);
}

复杂度分析:灵力消耗评估

  • 时间复杂度:O(n²),因为每个中心点最多向外扩展n次。
  • 空间复杂度:O(1),因为只使用了常量级的额外空间。

哪吒使用优化后的代码,火尖枪的灵力消耗大幅减少,成功破解了回文森林的难题。

变式训练:阵法变形的应对

  1. 字符串为空或只有一个字符:如"""a",最长回文子串为原字符串。
  2. 字符串包含多个回文子串:如"cbbd",最长回文子串为"bb"
  3. 字符串很长:如"abcba",验证算法的效率。
  4. 字符串中无回文子串:如"abc",返回空字符串或单个字符。

哪吒通过这些变式训练,进一步巩固了对中心扩散法的理解。

太乙口诀:修炼的智慧

火尖枪破,中心扩散显神通。
单双中心,回文扩散,最长记录。

口诀解释

  • 火尖枪破:象征中心扩散法的智慧,通过从中心向两边扩散,寻找最长回文子串。
  • 中心扩散显神通:从每一个可能的中心点开始,向两边扩散,寻找回文子串。
  • 单双中心:考虑单个字符和两个字符之间的中心点。
  • 回文扩散:从中心向两边扩散,检查是否为回文。
  • 最长记录:记录最长的回文子串,直到遍历完整个字符串。

文章总结

在这篇文章中,我们跟随小哪吒学习了如何使用中心扩散法解决最长回文子串的问题。通过暴力解法的尝试,哪吒意识到逐个检查子串虽然简单,但效率低下。在太乙真人的指引下,他领悟了中心扩散法的精髓,通过从每一个可能的中心点开始,向两边扩散,寻找最长回文子串,大大减少了灵力消耗。我们还详细介绍了C++中字符串操作的特性,包括substr[]操作符的使用。通过这次修炼,哪吒不仅提升了算法能力,还对字符串处理有了更深刻的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

轻口味

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

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

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

打赏作者

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

抵扣说明:

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

余额充值