SWUST OJ 29题 : 判断变位词


题目

如果两个单词的组成字母完全相同,只是字母的排列顺序不一样,则它们就是变位词,两个单词相同也被认为是变位词。如tea 与eat , nic 与cin, ddc与dcd, abc与abc 等。你的任务就是判断它们是否是变位词。

输入

第一行一个N,表示下面有N行测试数据。每行测试数据包括两个单词,如tea eat ,它们之间用空格割开

输出

对于每个测试数据,如果它们是变位词,输出Yes,否则输出No.

样例输入

3
tea eat
ddc cdd
dee dde

样例输出

Yes
Yes
No

话不多说,先上代码

#include <stdio.h>
#include <string.h>

int swap(char str[]);

int main()
{
	int n = 0;
	scanf("%d", &n);
	
	char str1[105] = { 0 };
	char str2[105] = { 0 };
	
	while (n > 0)
	{
		if (n > 0)
		{
			scanf("%s %s", str1, str2);

			int len = strlen(str1);
			int i, j;

			if (strlen(str1) != strlen(str2))
			{
				printf("No\n");
			}
			else
			{
				swap(str1);
				swap(str2);
			}

		}
		if (strcmp(str1, str2) == 0)
		{
			printf("Yes\n");
		}
		else
		{
			printf("No\n");
		}
		n--;
	}
	return 0;
}
int swap(char str[])
{
	int a, b;
	for (a = 0;a < strlen(str);a++)
	{
		for (b = 0; b < strlen(str) - a - 1;b++)
		{
			if (str[b] > str[b + 1])
			{

				char c;
				c = str[b];
				str[b] = str[b + 1];
				str[b + 1] = c;
			}
		}
	}
	return 0;
}

由于是新手上路,代码可能过长。如果看不明白的友友可以先看分析

分析:

由题目可知,变位词其实就是长度相等以及字符相同的字符串。如果知道了这个点那么这道题的难度就减少一半了。但还存在一个难点就是如何去判断这两个字符串呢?
这里我们就需要用到专门处理字符串的函数库:<string.h>,里面刚好有我们需要的函数:测量字符长度的函数 strlen() 和判断字符串是否相等的函数 strcmp()。到此我们的分析可以告一段落了。

我相信看到这儿,部分友友的问题又来了。光知道这两函数叫啥,但这个strlen和这个strcmp怎么用啊。 (别急小编这就为你解惑)

函数strlen()和函数strcmp()

strlen()

strlen() 的标准格式:

size_t strlen ( const char * str );

在使用时直接将所以测量的字符串放在括号里即可。

测量原理:一直测量直到遇到 ’ \0’

注意:
字符串是以 ‘\0’ 结尾。故测量的长度会比字符串的长度短1。

size_t :无符号整数 (等同于unsigned int)
注意: 由于是无符号整数说明无负数,如果不注意的话很容易翻车。
举个栗子(顺便也看看strlen的用法):

#include<stdio.h>
#include<string.h>
int main()
{
    char str1[] = "abcdef";
    char str2[] = "bbb";
    if(strlen(str2) - strlen(str1) > 0)
    {
        printf("str2的长度更长\n");
    }
    else
    {
        printf("str1的长度更长\n");
    }
    return 0;
}

运行结果

str2的长度更长

--------------------------------
Process exited after 0.1615 seconds with return value 0
请按任意键继续. . .

可能大部分人都不相信居然是str2更长,但是细看前面的无符号整型便又恍然大悟。str2比str1短是事实,但是strlen的返回值是无符号的整型即非负,故返回str2更长。

strcmp()

strcmp的标准格式:

int strcmp(const char* str1, const char* str2)

在使用时直接将需要比较的两个字符串放在括号里即可。

返回值:
若str1 == str2 则返回: 0;
若str1 > str2  则返回: 大于0的数;
若str1 < str2  则返回: 小于0的数;

使用时的注意事项:
strcmp的判断原理:strcmp()函数首先将str1字符串的第一个字符的ACSII值减去str2第一个字符的ACSII值(自左向右逐个字符相比,直到出现不同的字符或遇’\0’为止) 。

由此可看出strcmp在结束前所比较的字符必定时一样的(如果不同则已经结束)。由此便发现strcmp的局限性还蛮大的,但应对此题还勉勉强强。(因为题目只需要判断出是否为变位词,而变位词的字符和长度都一样只是顺序不同而已。)

看过代码的友友肯定也发现了main函数后面还有一个交换字符位置的函数,这便是使所需要判断的字符串达到strcmp使用的条件。 (此处是指满足题意而不是strcmp的使用条件)

交换函数的解释:

方便解释,代码如下

int swap(char str[])
{
	int a, b;
	for (a = 0;a < strlen(str);a++)
	{
		for (b = 0; b < strlen(str) - a - 1;b++)
		{
			if (str[b] > str[b + 1])
			{

				char c;
				c = str[b];
				str[b] = str[b + 1];
				str[b + 1] = c;
			}
		}
	}
	return 0;
}

此处两个for循环的目的是: 通过两层for循环每一次都将最大的字符放在最后 。然后在第一次内层for循环结束后,将最大的字符放在最后,然后a增加1代表着下次进入内层for循环时便能得到第二大的字符,以此类推。

小编自说:

本篇文章如有不足之处还请各位大佬指出,这题肯定有更好的解,若大家愿意的话可以打在评论区,让大家一起观摩学习。小编也是新手上路,本题也是自己的一点见解,如果对你有帮助的话,我很高兴。如果没有的话,希望你能找到对你有帮助的文章。

如果觉得小编写的不错,可以关注小编

本篇是小编的第一篇文章,以后小编会不断发布其他文章,希望能和大家一起学习进步。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大海眷恋的鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值