题
这题不难,他提醒我要从正反两个思维看待问题,问题有顺着思路的模拟,也有从结果出发,寻找过程量,还有从两头出发,特此记录一下;
链接: cf.
AC代码:
#include <bits/stdc++.h>
using namespace std;
int t;
string s;
int main()
{
cin >> t;
while (t--)
{
cin >> s;
int len = s.length();
int l = 0;
int r = len - 1;
while (l <= r)
{
if (s[l] - 'a' == r - l)
{
l++;
}
else if (s[r] - 'a' == r - l)
{
r--;
}
else
{
break;
}
}
puts(l > r ? "YES" : "NO");
}
system("pause");
return 0;
}
正向思维
这是比较麻烦的思路:
首先找到’a’的位置,然后判断左右是否有比大一的字符,这样处理比较麻烦,而且字符比较还不对,后来想的是既然从a到长度,那就是相对固定的,逆向思维的缺乏啊,,,,,,
#include <bits/stdc++.h>
using namespace std;
int t;
string s;
int main()
{
cin >> t;
while (t--)
{
cin >> s;
int len = s.length();
char lastmax = 'a';
int i = 0, j = 0;
int k;
for (int i = 0; i < len; i++)
{
if (s[i] == 'a')
{
k = i;
break;
}
}
i = k - 1;
j = k + 1;
while (1)
{
if (i >= 0 && s[i] == lastmax + 1)
{
lastmax++;
i--;
}
else if (j < len & s[j] == lastmax + 1)
{
lastmax++;
j++;
}
else
{
if (i == 0 && j == len - 1)
{
cout << "Yes" << endl;
break;
}
else
{
cout << "No" << endl;
break;
}
}
}
}
system("pause");
return 0;
}