使用双指针在C++中检查给定字符串是否为回文


回文是指一个单词、短语、数字或其他字符序列,从前后两个方向读取都相同。在字符串中,回文字符串是可以从左到右和从右到左读取都相同的字符串。在这篇文章中,我们将学习如何使用双指针技术在C++中检查给定字符串是否为回文。

问题

给定一个字符串,我们必须使用C++中的双指针方法检查它是否为回文。

示例 1

    输入: "abcba"

    输出: True

解释

"abcba" 是一个回文,因为它正反读都相同,反转后与原始字符串相同或一致。

示例 2

    输入: "ayush"

    输出: False

解释

"ayush" 不是回文,因为它正反读不相同,反转后与原始字符串不相同或不一致。

示例 3

    输入: "Abcba"

    输出: False

解释

"Abcba" 不是回文,因为它正反读不相同,除非你明确忽略大小写差异,否则此比较区分大小写。

使用双指针的解决方案

双指针技术是一种流行的算法,用于解决涉及序列(如数组或字符串)的问题。它是帮助降低时间复杂度并使解决方案更有效、更容易理解的方法之一。在这种方法中,我们使用两个指针:一个从开头,另一个从结尾。我们将左指针设置在字符串的开头(索引 0),将右指针设置在字符串的结尾(长度 - 1)。我们将比较左右位置的字符,直到左指针不再小于右指针。如果在任何位置字符不相等,则返回 false。如果它们相等,则我们将左指针向前移动一个位置,将右指针向后移动一个位置。

步骤

  • 设置两个指针:左指针和右指针。左指针从字符串的开头(索引 0)开始,右指针从字符串的结尾(长度 - 1)开始。
  • 运行循环,直到左指针小于右指针。如果字符相等,则将左指针向前移动一个位置,将右指针向后移动一个位置。继续此过程,直到左指针与右指针相遇或超过右指针。
  • 循环完成后返回 true。

实现

#include <bits/stdc++.h>
using namespace std;

bool stringPalindrome(string str) {
    int left = 0;
    int right = str.size() - 1;

    while (left < right) {
        if (str[left] != str[right]) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

int main() {
    string input;
    cout << "Enter a string: "<< endl;
    cin >> input;

    if (stringPalindrome(input)) {
        cout << "The string is a palindrome." << endl;
    } else {
        cout << "The string is not a palindrome." << endl;
    }
    return 0;
}

输出

Enter a string:
aba
The string is a palindrome.

时间复杂度:O(n),因为我们遍历了一半的字符串。

空间复杂度:O(1),常数空间

更新于:2024年11月13日

24 次浏览

启动你的职业生涯

通过完成课程获得认证

开始
广告