C++ C++;算法简单的递归回文检查器
我写了一个字符串回文检查器,我的导师说它比需要的复杂。我读过类似的文章,也在谷歌上搜索过,但我完全不知道如何让它以比这更少的步骤工作C++ C++;算法简单的递归回文检查器,c++,recursion,C++,Recursion,我写了一个字符串回文检查器,我的导师说它比需要的复杂。我读过类似的文章,也在谷歌上搜索过,但我完全不知道如何让它以比这更少的步骤工作 void isPal(string str){ int length = str.length(); if(length <= 1) cout << "Palindrome" << endl;//check for zero or one digit numbers else if(str.at(0) == str.at(length
void isPal(string str){
int length = str.length();
if(length <= 1) cout << "Palindrome" << endl;//check for zero or one digit numbers
else if(str.at(0) == str.at(length -1)) {
str = str.substr(1, (length - 2));
isPal(str);}
else cout << "Not a palindrome." << endl;{
cin >> str;}
void isPal(字符串str){
int length=str.length();
如果(长度Hmm)使其不递归是一种尝试
int i = 0;
int j = str.length() - 1;
bool isPalindrome = true;
while(i < j && isPalindrome)
{
if(str[i++] != str[j--]) isPalindrome = false;
}
inti=0;
int j=str.length()-1;
bool isPalindrome=true;
while(i)isAlindrome=false;
}
检查以下内容:
int is_pal(int start, int end, string &str)
{
if (start >= end)
return 1;
if (str[start] != str[end])
return 0;
return is_pal(++start, --end, str);
}
从main调用该方法。如果有帮助,请告诉我。:)使用递归
如果仍要使用递归,请执行以下操作:
bool isPal(const string &str, int start, int end)
{
if (start >= end)
return true;
if (str[start] != str[end])
return false;
return isPal(str, ++start, --end);
}
并在主体中调用isPal(str,0,str.length()-1)
。其思想是使用两个索引并移动它们,因为在递归中每次都不想使用substr()
无递归
实际上,这个问题很容易解决,无需使用递归,如下所示:
bool isPal(const string &str)
{
int start=0, end=str.length()-1;
while (start < end) {
if (str[start++] != str[end--])
return false;
}
return true;
}
bool isPal(常量字符串和str)
{
int start=0,end=str.length()-1;
while(开始<结束){
如果(str[start++]!=str[end--])
返回false;
}
返回true;
}
它应该是一个返回true或false的函数,而不是打印消息。参数应该是单个字符串对象
bool isPalindrome( const std::string & word ){
std::string::const_iterator fwd = word.begin();
std::string::const_iterator rev = word.end();
if( rev - fwd <= 1 ) return true;
if( *fwd++ != *--rev ) return false;
return isPalindrome( std::string( fwd, rev ) );
}
不是很讨人喜欢,是吗?-但一个人可以做得更好
bool isPal2( string::const_iterator fwd, string::const_iterator rev ){
return rev - fwd <= 1 || *fwd++ == *--rev && isPal2( fwd, rev );
}
现在,我们已经避免了创建字符串对象,即使是在回文或“回文类”的罕见情况下,也只需要一个额外的参数,至少没有冗余信息。如果您试图检查字符串是否为回文,您可以通过以下方式轻松完成:
将字符串插入到向量中
反转向量v并将其插入另一个称为“假设v1”的向量
如果v==v1,则为回文,否则为非回文
我刚刚建议了一种检查回文的方法。没有别的。你应该把字符串一分为二并进行比较?一起使用两个索引,你不想使用.substr。@elmigranto这个问题的任务是使用递归。否则我可以将整个字符串与其相反的字符串进行比较,对吗?@herohuyongtao我是否在不使用.substr的情况下删除了第一个和最后一个字符?@brock是的,正确。std::equal(s.cbegin()、s.cend()、s.crbegin())谢谢,但我应该在这个问题上使用递归。哈哈,np。看起来另一个答案是递归等价的。我不得不用字符串str
替换char*str
,但这很有效。谢谢。这不是“算法简单”因为它要求调用方在调用中添加两个索引值。@elmigranto如果您不理解,请不要编辑它。最好通过常量引用传递字符串:P@Drongo有趣的是,这个问题现在有超过10000个视图,但它和公认的答案(你的)都没有请原谅,我不理解参数string&word
@brock这是通过引用传递参数的表示法。在C语言中,必须在参数规范中使用“type*par”,在调用中使用“&variable”,在函数体中使用“*par”来实现(或多或少)相同的效果。可怕的O(n^2)
算法,因为它为每个pass@Alnitak我相信您可以向我们展示一个算法简单的递归版本,即单个函数,签名如问题所示。好的(除了返回与消息问题)你的函数在功能上相当于OP发布的那篇他说不够好的文章-都创建了一个新的stringNeed…更多…向量…:)只需使用std::equal
和反向迭代器。通过在循环中调用strlen()
,你就得到了算法O(n^2)而不是O(n)只提供代码而没有解释的答案不是特别有用欢迎使用stackoverflow!虽然此代码块可能会回答此问题,但您应该尝试使用代码的相关解释来改进您的答案。如果您修复此问题以对字符串使用常量引用,请参阅我将向上投票parameters@Alnitak修正了,谢谢你的广告恶习
bool isPalindrome(char str[], int i) {
int x=(strlen(str)-i);
if (i==0) {
return true;
}
if (str[x]!=str[i-1]) {
return false;
}
return isPalindrome(str, i-1);
}
string word = "reviver";
bool res = isPal2( word.begin(), word.end() );
bool isPalindrome(char str[], int i) {
int x=(strlen(str)-i);
if (i==0) {
return true;
}
if (str[x]!=str[i-1]) {
return false;
}
return isPalindrome(str, i-1);
}