【题目】如上
【思路】(1)回文:利用reverse函数反转字符串赋值给一个新string对象,再判断两个对象是否相等 (2)同构:find函数返回第一次出现该字符的下标,如果第二次出现时,则返回的是第一次出现时的下标如foo和bar,foo最后的o返回1,而bar最后的r返回的是2,下表不相同则为不同构。
【代码】
#include
#include
#include
using namespace std;
class String
{
public:
int n;
string a;
String(int k)
{
n = k;
}
friend istream& operator>>(istream& input, String& s)
{
cin >> s.a;
return input;
}
int isPalindrome();
int isIsomorphic(String);
};
int String::isPalindrome()
{
string b = a;
string c;
int len = a.length();
int count = 0;
//利用reverse反转字符串
reverse(b.begin(), b.end());
if (a == b)
{
return 1;
}
else
{
for (int i = 0; i <= len - 1; i++)
{
//重新对b赋值,保证每次用erase函数删除时,都是从原字符串任意减1
b = a;
b.erase(i, 1);
//用c记录b反转前的字符串
c = b;
reverse(b.begin(), b.end());
if (b == c)
{
count = 1;
break;
}
}
if (count == 1) return 1;
else return 0;
}
}
int String::isIsomorphic(String s)
{
//find函数返回第一次出现该字符的下标
//如果第二次出现时,则返回的是第一次出现时的下标
//如foo和bar,foo最后的o返回1,而bar最后的r返回的是2,不相同
for (int i = 0; i < a.length(); i++)
{
if (a.find(a[i]) != s.a.find(s.a[i]))
return 0;
}
return 1;
}
int main() {
int n, m;
while (cin >> n) {
String s1(n);
cin >> s1;
cout << s1.isPalindrome() << endl;
cin >> m;
String s2(m);
cin >> s2;
cout << s2.isIsomorphic(s1) << endl;
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)