我正在尝试编写一个代码,用于检查字符串是否为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");
}
答案 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;
}