回文程序不返回正确答案
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;
}
我目前正在用 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;
}