给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-if-one-string-swap-can-make-strings-equal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#include<winuser.inl>
#include<stdio.h>
#include <time.h>
#include <cstdlib>
#include <string.h>
#include<vector>
#include<string>
using namespace std;
//bool Judge(char* string1, char* string2);
int position1 = 0, position2 = 0;
int Array_len(char array[20]);
bool Judge(char* string1, char* string2);
int main()
{
char str1[20], str2[20];
printf("enter the first str1: ");
scanf_s("%s", str1,20);
rewind(stdin);
//int c;
//while ((c = getchar()) != '\n' && c != EOF);
printf("enter the first str2: ");
scanf_s("%s", str2,20);
printf("\n");
if (Judge(str1, str2))
{
if (strcmp(str1, str2) == 0) //判断是否不用交换就是相等的
{
printf("true \n");
printf("两个字符串已经相等,所以不需要进行字符串交换\n");
}
else
{
printf("true \n");
printf("例如,交换 s2 中的第 %d 个和 %d 字符可以得到 %s \n", position1, position2,str2);
}
}
else
{
printf("false\n");
printf("一次字符串交换无法使两个字符串相等\n");
}
return 0;
}
bool Judge(char string1[20], char string2[20])
{
//思想:把第1个字符串看做参照,尝试调换字第二个字符串里面的每一个字符串的字母间的顺序,每操作一次,就进行一次判断,看调换字符顺序的字符串是否满足条件,
//1.如果第一次判断(还没有进行交换),就发现两者相等就显示两者相等,同时返回ture
//2.如果第一次不满足条件,继续向后判断,为真,则结束循环,显示交换的是哪个字符串里面的哪两个字母。
//3.否则继续执行,直到遍历完所有的情况,如果第一个字符串没有一个符合条件,输出false,
int len1, len2;
char temp[20];
len1 = Array_len(string1);
len2 = Array_len(string2);
if (len1 != len2)
{
return false;
}
///else if (strcmp(str1.c_str(), str2.c_str()) == 0) 对string的判断
else if (strcmp(string1, string2) == 0)
{
return true;
}
else
{
//遍历字符串2,每交换一次,进行一次判断
for (int i = 0; i < len2; i++)
{
for (int j = 1; j < len2; j++)
{
// 如果要从数组a复制k个元素到数组b,可以这样做 memcpy(b,a,sizeof(int)*k);
memcpy(temp, string2, sizeof(int) * (len2 + 1));
temp[i] = string2[j];
temp[j] = string2[i];
if (strcmp(string1, temp) == 0)
{
position1 = i;
position2 = j;
return true;
}
}
}
}
return false;
}
int Array_len(char array[20])
{
int length = 0;
while ((length++, *array++ != '\0'))
;
return length-1; //去掉换行符的那一个长度
}