哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的回文森林,森林中弥漫着神秘的气息。森林的入口处有一块巨大的石碑,上面刻着一行文字:“欲破此林,需以火尖枪之力,破回文之障,寻最长回文子串。”
哪吒定睛一看,石碑上还有一行小字:“字符串"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),因为只使用了常量级的额外空间。
哪吒使用优化后的代码,火尖枪的灵力消耗大幅减少,成功破解了回文森林的难题。
变式训练:阵法变形的应对
- 字符串为空或只有一个字符:如
""
或"a"
,最长回文子串为原字符串。 - 字符串包含多个回文子串:如
"cbbd"
,最长回文子串为"bb"
。 - 字符串很长:如
"abcba"
,验证算法的效率。 - 字符串中无回文子串:如
"abc"
,返回空字符串或单个字符。
哪吒通过这些变式训练,进一步巩固了对中心扩散法的理解。
太乙口诀:修炼的智慧
火尖枪破,中心扩散显神通。
单双中心,回文扩散,最长记录。
口诀解释:
- 火尖枪破:象征中心扩散法的智慧,通过从中心向两边扩散,寻找最长回文子串。
- 中心扩散显神通:从每一个可能的中心点开始,向两边扩散,寻找回文子串。
- 单双中心:考虑单个字符和两个字符之间的中心点。
- 回文扩散:从中心向两边扩散,检查是否为回文。
- 最长记录:记录最长的回文子串,直到遍历完整个字符串。
文章总结
在这篇文章中,我们跟随小哪吒学习了如何使用中心扩散法解决最长回文子串的问题。通过暴力解法的尝试,哪吒意识到逐个检查子串虽然简单,但效率低下。在太乙真人的指引下,他领悟了中心扩散法的精髓,通过从每一个可能的中心点开始,向两边扩散,寻找最长回文子串,大大减少了灵力消耗。我们还详细介绍了C++中字符串操作的特性,包括substr
和[]
操作符的使用。通过这次修炼,哪吒不仅提升了算法能力,还对字符串处理有了更深刻的理解。