题目
如果两个单词的组成字母完全相同,只是字母的排列顺序不一样,则它们就是变位词,两个单词相同也被认为是变位词。如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循环时便能得到第二大的字符,以此类推。
小编自说:
本篇文章如有不足之处还请各位大佬指出,这题肯定有更好的解,若大家愿意的话可以打在评论区,让大家一起观摩学习。小编也是新手上路,本题也是自己的一点见解,如果对你有帮助的话,我很高兴。如果没有的话,希望你能找到对你有帮助的文章。
如果觉得小编写的不错,可以关注小编
本篇是小编的第一篇文章,以后小编会不断发布其他文章,希望能和大家一起学习进步。