我正在尝试编写一个简单的c ++程序,让用户知道他们输入的单词是否是回文。例如:'妈妈'是回文。
这就是我所拥有的:
#include <iostream>
#include <string>
using namespace std;
// Forward Declaration
string reversed_string(string);
int main(){
string str;
string reversed;
cout << "Enter string to check:\n";
getline(cin, str);
reversed = reversed_string(str);
if(str == reversed){
cout << str << " is palindrome\n\n";
}
else{
cout << "Not palindrome";
}
}
string reversed_string(string str){
string reversed;
for(int i = int(str.length()); i >= 0; i--){
reversed += str[i];
}
return reversed;
}
当我尝试输入回文词时,它总是转到我的main函数中的else语句。我做错了什么?
答案 0 :(得分:1)
字符串的最后一个字符位于索引len - 1
,而不是len
。根据标准(C ++ 11):
如果
*(begin() + pos)
,则返回pos < size()
。否则,返回对charT类型的对象的引用,其值为charT(),其中修改对象会导致未定义的行为。
该标准实际上意味着,如果pos
不小于字符串长度,则该函数返回对空字符的引用。因此,您将放入反向字符串的第一个字符为空。
但是,你真的不需要反转字符串来查找它是否是回文,可能更容易简单地使用以下(伪代码)算法:
def isPalindrome(string):
set left to zero
set right to one less than string length
while left is less than right:
if string[left] is not equal to string[right]:
return false
add one to left
subtract one from right
return true
鉴于你必须处理每个字符以形成反向字符串,你也可以使用该处理能力来检查原始字符串中的字符。这样,如果它不是回文,你可以提前退出。
当然,这会将空字符串视为回文,这可以说是正确的。如果您不认为这是正确的,只需先检查一下:
def isPalindrome(string):
if string length is zero:
return false
set left to zero
... and so on