现在我正在制作一个程序,它会告诉你输入的字符串是否是回文,我最后一步陷入困境。有三个基本函数可以删除句子中的所有空格,将它们删除为小写,然后反转它们,然后当我的函数验证它们然后返回一个布尔值时。所以现在这个功能,生日快乐!将作为yadhtribyppah出现。 这是我到目前为止在我的功能中所拥有的:
string updated1;
string updated2;
updated1 = makeLower(verify);
updated2 = removeNonLetters(updated1);
updated1 = reverse(updated2);
for (int i = 0; i < updated2.length(); i++)
{
if (updated2[i] != updated1[i])
{
break;
return false;
}
else if (updated2[i] == updated1[i])
{
return true;
}
}
}
答案 0 :(得分:1)
假设您的其他功能没有错误,请将for循环更改为:
for (int i = 0; i < updated2.length(); i++)
{
// If we find even one inequality, we know its not a palindrome.
if (updated2[i] != updated1[i])
return false;
}
// if the for loop has been executed satisfactorily, we know that it is a palindrome.
return true;
答案 1 :(得分:1)
break
,而不是在字符不同的情况下返回false。return true
- 在你完成所有角色之前,你不知道它是一个回文!相反,如果for循环结束,则返回true,在循环之外。答案 2 :(得分:0)
这不起作用的原因是因为您在返回语句之前有break
语句。这会打破循环,因此永远不会调用返回。
可能的解决方案:
1)删除“if not equal”情况下的break语句。 2)默认情况下,在函数末尾的循环外返回false。
修改强>
我也注意到你是从“if is equal”的情况下回来的。如果你这样做,那么它只会检查第一组字符。一个更好的算法是在“如果不相等”的情况下返回false,删除“if equal”的情况,然后在函数结束时默认返回true。
答案 3 :(得分:0)
在第一个break
中return
语句之前不应该有if
,而在第二个return true
中也不应该#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool isnotalpha(char c){return !isalpha(c);}
int main(void)
{
string updated1="AbbA",updated2;
transform(updated1.begin(),updated1.end(),updated1.begin(),tolower);
updated1.erase(remove_if(updated1.begin(),updated1.end(),isnotalpha),updated1.end());
updated2=updated1;
reverse(updated2.begin(),updated2.end());
bool palindrome=true;
for(int i=0; i<updated1.length(); i++)
{
if(updated1[i]!=updated2[i]) palindrome=false;
//if(updated1[i]!=updated1[updated1.length()-1-i]) palindrome=false; Can be done without using updated2
}
if(palindrome) cout << "Palindrome!" << endl;
else cout << "Not Palindrome!" << endl;
return 0;
}
因为你没有完成循环。
你可以做这样的事情:
{{1}}
答案 4 :(得分:0)
您不必反转字符串只需要检查它是否是对称的
bool testIt(const string value)
{
string updated2 = makeLower(removeNonLetters(value));
int L = updated2.length();
for(var i = 0; i < L/2; i++)
{
if (updated2[i] != updated2[L-1-i])
return false;
}
return true;
}