在C ++中查找两个字符串是否为字谜

时间:2015-12-15 17:41:53

标签: c++

我正在尝试编写一个代码,用于检查字符串是否为anagram。但是我不断得到错误“你不能分配给一个恒定的变量”。我明白这意味着什么,但对此有什么解决方法/解决方案?

    #include <iostream>
    #include <algorithm>
    #include <string>
    using namespace std;

    bool check_str(const string& a, const string& b)
    {

    // cant be the same if the lenghts are not the same 
    if (a.length() != b.length())
        return false;
    //both the strings are sorted and then char by char compared
    sort(a.begin(), a.end());
    sort(b.begin(), b.end());

    for (int i = 0; i < a.length(); i++)
    {
        if (a[i] != b[i]) //char by char comparison
            return false;
    }

    return true;
}

int main()
{
    string a = "apple";
    string b = "ppple";

    if (check_str(a, b))
    {
        cout << "Yes same stuff" << endl;
    }
    else
    {
        cout << "Not the same stuff" << endl;
    }
    system("pause");
 }

5 个答案:

答案 0 :(得分:7)

您尝试std::sort您的输入字符串会修改它们,但您也声明它们const(通过将它们作为const std::string&传递),禁止修改它们。

通过价值,即

bool check_str(string a, string b)

或非const引用,即

bool check_str(string& a, string& b)

代替。后者将修改您的原始字符串,前者不会。此外,第一个版本将接受临时版本,第二个版本不会接受临时版本。

在我看来,通过值传递将是这里的方式,因为一些名为check_str的函数修改其输入似乎是反直觉的。

最后评论:正如评论中已经提到的,您不需要使用循环来比较字符串,您只需将它们与a == b进行比较。

答案 1 :(得分:0)

两个字符串都是常量引用,但您尝试对它们进行排序。这显然会改变字符串,因此无效。您可以复制字符串,或者按值而不是引用传递。

答案 2 :(得分:0)

由于字符串是const,因此无法对它们进行排序。 制作它们的副本可能是一种解决方法,但我认为当字符串很大时,它会使空间复杂度为O(n),如果要排序,则使时间复杂度为O(nlgn)。我更喜欢这种方法,时间O(n),空间O(1):

#define SIZE CHAR_MAX + 1
bool check(const char a[], const char b[]) {
    if (strlen(a) != strlen(b)) return false;
    int length = strlen(a);
    int char_count_a[SIZE] = {0};
    int char_count_b[SIZE] = {0};
    for (int i = 0; i < length; ++i) char_count_a[a[i]]++;
    for (int i = 0; i < length; ++i) char_count_b[b[i]]++;
    for (int i = 0; i < SIZE; ++i) 
        if (char_count_a[i] != char_count_b[i]) return false;
    return true;
}

答案 3 :(得分:0)

只是为了好玩:

#include <algorithm>
#include <string>

bool check_str(const std::string& a, const std::string& b) {
    if (a == b)
        return true;
    std::string temp(a);
    std::sort(temp.begin(), temp.end());
    while (std::next_permutation(temp.begin(), temp.end())
        if (temp == b)
            return true;
    return false;
}

答案 4 :(得分:0)

最简单的工作代码,带有const引用参数

bool check_str(std::string const &a, std::string const &b) {
    if (a == b)     return true;
    std::string t1(a);
    std::string t2(b);
    std::sort(t1.begin(), t1.end());
    std::sort(t2.begin(), t2.end());
    if(t1 == t2)    return true;
    return false;
}

或传递价值

bool check_str(std::string a,std::string b) {
    if (a == b)     return true;
    std::sort(a.begin(), a.end());
    std::sort(b.begin(), b.end());
    if(a == b)    return true;
    return false;
}