soj 1283. Comparison

本文介绍了一种特殊的字符串比较算法,该算法能将字符串分割为字母和数字块,并按特定规则进行比较。具体步骤包括:先分割字符串,再逐一比较每个部分。文章详细解释了比较过程中的各种情况处理,如字典序、数字序以及不同类型的块之间的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给两个字符串(只包含'a'-'z' , 'A'-'Z' , '0'-'9'),比较它们的大小。

比较方法:

    (1)先把它们分别分割成只包含字母和只包含数字的小块,比如,abc123x分割成“abc”,“123”,“x”。

   (2)把小块顺次比较,如果前N个小块都相等,第N+1个小块存在大小差异,那么比较结果与第N+1个小块的比较结果相同,后面的所有小块不再作比较。

   (3)如果一方已经没有小块可以比较,那么比较结果与小块数目相同。

小块比较方法:

   (1)如果两个小块都只包含字符,那么按照字典序比较("abc" > "abC")

   (2)如果两个小块都只包含数字,那么按照数字序比较("12 < "112")

   (3)如果一个只包含字母,另一个只包含数字,那么只包含字母的小块更大

思路:

手写split 函数(python等语言里面都有这个函数),模拟。

坑爹之处:

字典序很简单

数字序。。。深坑。。。前置0。。。。

代码就不用多解释了:

#include <iostream>
#include <cstring>
using namespace std;

int t, na, nb;
string a, b;
string pa[1005], pb[1005];
void split(string &s, int &ns, string ps[])
{
	ns = 0;
	bool flag = isalpha(s[0]);
	int len = s.length(), sl = 1, p = 1;
	while (p < len)
	{
		if (bool(isalpha(s[p])) == flag) sl ++;
		else
		{
			ps[ns++] = s.substr(p-sl, sl);
			sl = 1;
			flag = !flag;
		}
		p ++;
	}
	ps[ns++] = s.substr(p-sl, sl);
}
void deleteZero(string &s)
{
	int p = 0;
	while (p < s.length()-1 && s[p] == '0') p ++;
	s = s.substr(p, s.length()-p);
}
int compare(string &s, string &t)
{
	if (isalpha(s[0]) && isdigit(t[0])) return 1;
	else if (isalpha(t[0]) && isdigit(s[0])) return -1;
	else if (isalpha(s[0]))
	{
		if (s > t) return 1;
		if (s < t) return -1;
		return 0;
	}
	else
	{
		deleteZero(s);
		deleteZero(t);
		if (s.length() > t.length()) return 1;
		if (s.length() < t.length()) return -1;
		if (s > t) return 1;
		if (s < t) return -1;
		return 0;
	}
}
char comparison()
{
	int ta = 0, tb = 0, c;
	while (ta < na && tb < nb)
	{
		c = compare(pa[ta], pb[tb]);
		if (c == 1) return '>';
		if (c == -1) return '<';
		ta ++; tb ++;
	}
	if (na > nb) return '>';
	if (na < nb) return '<';
	return '=';
}
int main()
{
	ios::sync_with_stdio(false);
	cin >> t;
	while (t --)
	{
		cin >> a >> b;
		split(a, na, pa);
		split(b, nb, pb);
		cout << comparison() << endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值