我写了一个字符串回文检查器,我的导师说它比它需要的更复杂。我已经阅读了类似的线程并且用Google搜索了,但我完全不知道如何使用比此更少的步骤来使用它...
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;}
答案 0 :(得分:5)
如果您仍想使用递归,请执行以下操作:
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;
}
答案 1 :(得分:4)
检查一下:
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调用方法。如果有帮助,请告诉我.. :)
答案 2 :(得分:2)
它应该是一个返回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 ) );
}
<强>后来强>
因此,带有单个参数的递归解决方案需要每个递归的新字符串对象。这被批评为“可怕” - 但它真的吗?必须根据预期的域来判断算法。
我们假设这个域名是英语单词。英语中有超过1.000,000个单词但是回文数小于200.因此递归必须一直到N / 2次迭代的概率几乎可以忽略不计。此外,具有相等的第一个和最后一个字母的单词的百分比非常小,因此在大多数情况下甚至不需要单个递归。
另一个可能的域是由字母“a”到“z”组成的随机字符串:超过96%甚至不需要单个递归调用。 “可怕”?几乎不
如果有人想要避免这种“恐怖”,可以有三种选择:避免递归,使用第二种方法(从第一种方法调用)或需要多个参数。
第三种变体是由其他人提出的,需要不少于三个参数,要求用户提供冗余信息,其中包含相当混乱的呼叫,例如:
string word = "evitative";
bool res = isPal( word, 0, word.length()-1 );
不是很讨人喜欢,是吗? - 但是人们可以做得更好!
bool isPal2( string::const_iterator fwd, string::const_iterator rev ){
return rev - fwd <= 1 || *fwd++ == *--rev && isPal2( fwd, rev );
}
通过适度复杂的电话:
string word = "reviver";
bool res = isPal2( word.begin(), word.end() );
现在我们已经避免了创建字符串对象,即使是在极少数情况下也会以一个额外参数为代价的回文或“回文”,至少没有多余的信息。
答案 3 :(得分:0)
嗯让它不是递归的尝试
int i = 0;
int j = str.length() - 1;
bool isPalindrome = true;
while(i < j && isPalindrome)
{
if(str[i++] != str[j--]) isPalindrome = false;
}
答案 4 :(得分:0)
如果您正在尝试检查字符串是否为回文,您可以轻松地执行以下操作:
我刚才提出了一种检查回文的方法。没别的。
答案 5 :(得分:-2)
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);
}