题目:
现有三张分别写上a,b,c的卡片组成的一排卡片组。你只能对卡片组进行一次或以下的操作——任选两张卡片进行交换。试问改组后的卡片能否呈现abc的排列。若能则输出“YES”,若不能则输出“NO”。
解法:
因每行输入仅由a,b,c三种卡牌组成,且规则仅允许进行一次位置交换操作,所以只有给定字符串中有两个字符错位才可能有解。(特别考虑原字符串已经排好的情况,即abc)。同时我们知道输入的字符串可以比规定的abc的长度更长,但只需要最后能呈现abc即可。
#include<iostream>
using namespace std;
bool shortSort(string str) //短排序判定函数
{
if (str == "abc")
return true;
string compare = "abc"; //设定一个比较的字符串作为参考对象
int counter = 0; //初始化错位字符数为0
for (int i = 0; i < compare.length(); i++) //比较范围限定为两个字符串的前3个字符
{
if (str[i] != compare[i]) counter++;
}
if (counter % 2 == 0) return true; //若错位字符数为偶数,则符合题意
else return false;
}
int main()
{
int number = 0;
cin >> number; //输入待输入的字符串长度,这里的长度可以大于3
for (int i = 0; i < number; i++)
{
string str;
cin >> str;
if (shortSort(str))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
局限:
虽然这种算法能在字符串的前3个字符的范围内排序,但是在输入的字符串长度大于3,且前三个字符串错位数为奇数的情况下,则不能得到正确的结果。这是因为在比较函数的范围内,只限定了前3个字符的范围。
该表明若前3个字符的错位数为奇数,则即便该字符串后面已经呈现了abc,但依然输出NO。