C ++获得最大的回文

时间:2015-09-16 22:41:55

标签: c++ string algorithm palindrome

我试图让这个函数工作,它应该采取输入字符串,然后将其更改为全部小写,然后摆脱所有的空格和标点符号,但我不能让它工作...我有一部分在结束时被注释掉,我不认为我需要它,但我不知道......如果有人对这个帮助有任何见解将不胜感激!

bool PalindromeFinder::isPalindrome(string input) {
//TODO define isPalindrome with the desired functionality
// make new string without the spaces and special characters
//isSpace and isPunct if space or thing then omit to make it a clean string
//need to store largest palindrome so far that was found

// make a string cleanString
string cleanString = "";

//make the string all lowercase
transform(input.begin(), input.end(), input.begin(), ::tolower);

    for ( int i=0; i <= input.length(); i++) {
        char cha = input[cha];

        // now, if there is punctuation or a space, then remove it
        if (ispunct(cha) || isspace(cha)) {
            //remove the punctuation or space
            input.erase(cha) == cleanString;
        }
    }


//        for ( int i=1; i <= input.length(); i++){
//            // check to make sure there are no spaces or punctuation
//        if (!ispunct(cha) && !isspace(cha))
//        {
//            //if there isnt then build the word...ex) e > ex > exa > exam
//            input += cha;
//
//            //this line is for testing
//            cout << "This is my clean string: " << input << endl;
//
//        }
//
//
//    }


//make a empty string to use as a template
    string revString = "";

// for all of the chars in the string, reverse them
    for (int i = cleanString.length()-1; i >= 0; i--)
    {
        // use this to access array index
        // add the letters back
        revString += cleanString[i];
    }

// now check and make sure that it equals each other...
if (cleanString == revString)
{
    // if it does, return true
    return true;
}
    //otherwise return false
else return false;
}

3 个答案:

答案 0 :(得分:0)

您错误地使用了string.erase() Read at the documentation.

string.erase()要求迭代器索引
你错误地给它一个char,它被提升为一个整数然后用作索引。

答案 1 :(得分:0)

不是编写错误的循环,而是需要两个函数来删除字符和反转字符串。

要删除std::string中的字符,您应该使用std::remove_if

input.erase(std::remove_if(input.begin(), input.end(), [](char c) 
                          { return ::ispunct(c) || isspace(c);}), input.end());  

Live Example

同样,要反转字符串,您可以使用std::reverse

答案 2 :(得分:0)

将tmp缓冲区设置为输入字符串的大小。跟踪输入字符串中的输入字符位置,并在输出缓冲区中输出字符位置。

这就是你在C中的表现。

#include <string.h> // for size_t
#include <ctype.h>  // for isalnum

// caller allocates output buffer large as large as input.
// length could be a function parameter, since caller needs to know it anyway.
size_t clean_string(char *out, const char* in)
{
    size_t inpos=0, outpos=0;
    while (in[inpos] != '\0') {
        char c = in[inpos++];
        if (isalnum(c)) // <-- put in whatever logic you want here
            out[outpos++] = c;
    }
    out[outpos] = '\0';
    return outpos;
}

这很简单,只复制一次角色。它也易于阅读和理解。对于C ++字符串类有一个很好的论据,可以确保你永远不会忘记尾随的'\0'

删除字符串中间的字符必须将所有以下字符复制一个。你可以通过慢速操作使用C ++来拍摄自己,可能没有意识到,因为你只看到input.erase()函数调用,而不是循环。