0
点赞
收藏
分享

微信扫一扫

【成长记录】C++题目——回文字符串和同构字符串

卿卿如梦 2022-04-23 阅读 51
c++

【题目】如上

【思路】(1)回文:利用reverse函数反转字符串赋值给一个新string对象,再判断两个对象是否相等 (2)同构:find函数返回第一次出现该字符的下标,如果第二次出现时,则返回的是第一次出现时的下标如foo和bar,foo最后的o返回1,而bar最后的r返回的是2,下表不相同则为不同构。

【代码】

#include<iostream>
#include<algorithm>
#include<string>
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 条评论