回文程序不返回正确答案

Palindrome program not returning correct answers

我目前正在用 C++ 编写代码,只想注意小写字母和数字。

我的问题是,当我输入包含整数和字符(例如小写字母)的字符串时,return 的正确答案和(数组的)奇数长度是否大于值 3 .

例如,如果我输入'1b1',它会return作为回文,否则如果我输入'1bbb1',它会return false。

代码如下:

bool isPalindrome(string s){
int len = s.size();
int mid = len / 2;
int unsigned i;

stack<char> palindromeStack;

for (i = 0; i < mid; i++)
{
    if(s[i] <= 47 && s[i] >= 58 ||
    s[i] <= 96 && s[i] >= 123){
        s.erase(i,1);
        i--;
        
    }

    if (s[i] > 47 && s[i] < 58 ||
    s[i] > 96 && s[i] < 123)
    {
        palindromeStack.push(s[i]);
    }

    if (len % 2 != 0)
    {
        i++;
    }
}

while (s[i] != '[=10=]')
{
    char ele;
    ele = palindromeStack.top();
    palindromeStack.pop();

    if (ele != s[i])
    {
        return false;
        i++;
    }
    return true;
}}

我认为这与与数组长度相关的 IF 语句有关,但由于我对编程还很陌生,所以我找不到解决方案。

如有任何帮助,我们将不胜感激! (这包括指导我解决已经回答的问题)

P.S。代码括号略有修改以适合 Stack Overflow 代码示例函数。

谢谢

我有更好的代码。使用任何数据结构模板并不表示它是好的代码。如果您的目标是检查一个字符串是否为包含字母数字字符的回文,请参考以下代码。我已经分享了截图作为例子:-

    #include <iostream>
    #include<string>
    using namespace std;

string transform(string s)
{
    string result = "";
    for(char ch : s)
    {
        if(('a'<=ch && ch<='z') || ('0'<=ch && ch<='9') )
        result += ch;
    }
    return result;
}
    
    int main() {

        string s="";
        
        // reading the input from the std input
        cin>>s;
        s = transform(s);
        bool isPalindrome = true;
        for(int i = 0, j = s.size()-1; i<=j; i++,j--)
        {
            if(s[i]!=s[j])
            {
                isPalindrome = false;
                break;
            }
        }
        if(isPalindrome)
        {
            cout<<"Palindrome";
        }
        else
        {
            cout<<"Not Palindrome";
        }
        return 0;
    }

关键是如果字符串两端的值不一样就不是回文。如果任何字符不相等,则证明它不是回文,因此我们无需进行其他比较。 这具有较少的代码行并且适用于所有场景。

此代码将在出现不匹配的第一个迹象时退出检查:

#include <cassert>
#include <string>

bool is_palindrome(const std::string& str)
{
    for (int front = 0, back = static_cast<int>(str.length()) - 1; front < back; ++front, --back)
    {
        if (str[front] != str[back]) return false;
    }
    return true;
}

int main()
{
    assert(is_palindrome(""));
    assert(is_palindrome("1"));
    assert(is_palindrome("121"));
    assert(is_palindrome("abcdefedcba"));
    assert(!is_palindrome("121abc"));
    return 0;
}

编辑(现在使用迭代器和反向迭代器):

bool is_palindrome(const std::string& str)
{
    for (auto [front, back] = std::tuple{str.begin(), str.rbegin()}; front < back.base(); ++front, ++back)
    {
        if (*front != *back) return false;
    }
    return true;
}