判断回文数组,不知道错在哪里了 求指教!该如何处理
判断回文数组,不知道错在哪里了 求指教!
#include <iostream>
#include <string>
using namespace std;
void judge(string &s,int m);
int main()
{
string s;
string a;
int m;
cout << "please enter the array you want to judge" << endl;
cin >> s;
m=s.size();
cout << m << endl;
judge(s,m);
return 0;
}
void judge(string &s,int m)
{
string b;
int i=0;
for (i=0;i<m;i++)
b[i]=s[m-1-i];
if(s.compare(b)==0)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
------解决思路----------------------
------解决思路----------------------
没有给string b分配空间
其实老老实实用algorithm里的函数不是更好:
------解决思路----------------------
你字符串b长度为0,你用下标操作当然崩溃啦,改成这样:
另外,建议你用下面几种方式代码质量会更高一些:
------解决思路----------------------
如果对STL熟悉就用2楼的方法
#include <iostream>
#include <string>
using namespace std;
void judge(string &s,int m);
int main()
{
string s;
string a;
int m;
cout << "please enter the array you want to judge" << endl;
cin >> s;
m=s.size();
cout << m << endl;
judge(s,m);
return 0;
}
void judge(string &s,int m)
{
string b;
int i=0;
for (i=0;i<m;i++)
b[i]=s[m-1-i];
if(s.compare(b)==0)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
------解决思路----------------------
for (i=0;i<m;i++)
b[i]=s[m-1-i];
b[m] = '\0';
------解决思路----------------------
没有给string b分配空间
其实老老实实用algorithm里的函数不是更好:
int main()
{
cout << "please enter the array you want to judge" << endl;
string str;
cin >> str;
cout << (equal(str.begin(), str.end(), str.rbegin()) ? "YES" : "NO") << endl;
return 0;
}
------解决思路----------------------
你字符串b长度为0,你用下标操作当然崩溃啦,改成这样:
#include <iostream>
#include <string>
using namespace std;
void judge(string &s, int m);
int main()
{
string s;
string a;
int m;
cout << "please enter the array you want to judge" << endl;
cin >> s;
m = s.size();
cout << m << endl;
judge(s, m);
return 0;
}
void judge(string &s, int m)
{
string b = s; // 让b和ss一样长
int i = 0;
for (i = 0; i < m; i++)
b[i] = s[m - 1 - i];
if (s.compare(b) == 0)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
另外,建议你用下面几种方式代码质量会更高一些:
#include <iostream>
#include <string>
using namespace std;
bool judge(const string &s) // 让s为const,由于用的是string,就不用m了,且返回值也改为bool
{
// 考虑使用以下测试用例:
// 1.空字符串 -> NO
// 2.“1234321” -> YES
// 3.“123321” -> YES
// 4.“1” -> YES
// 5.“123” -> NO
// 另外,你的函数没有考虑中文的,明确告诉你中文你的函数是不正确的,所以不要用中文测试,另外下面的算法是区分数据的大小写的
// 要让中文正确,需要对文字进行编码处理或者使用宽字符,在此不扩展
//// 方法一:
//// 用你的方法,只是代码改一下
//if (s.empty()) return false;
//string b = s; // 让b和ss一样长
//for (size_t i = 0; i < s.length(); ++i) // length为O(1)时间复杂度,一般为内联函数,效率不比你用整数预先存起来差
// b[i] = s[s.length() - 1 - i];
//
//return b == s; // string重载了==运算符,直接比较就行,可以不用compare
// 方法二(推荐):
// 原理与你的方法一样,只不过改进一下,少用一个字符串对象,空间复杂度只有你的一半
if (s.empty()) return false;
for (size_t i = 0; i < s.length() / 2; ++i) // 只要走到一半即可,如果个数为奇数,中间一个不用比,当然也可以全部走完,只是没必要,白白浪费时间
if (s[i] != s[s.length() - 1 - i]) return false;
return true;
//// 方法三:
//// 使用系统库函数将字符串反转再比较(空间复杂度和方法一相同)
//if (s.empty()) return false;
//string b = s;
//reverse(b.begin(), b.end());
//return s == b;
}
int main()
{
string s;
cout << "please enter the array you want to judge" << endl;
cin >> s;
cout << s.length() << endl;
cout << (judge(s) ? "YES" : "NO"); // 输出放在外面,不要放在judge中
return 0;
}
------解决思路----------------------
如果对STL熟悉就用2楼的方法