前言
这个关键字相当于在找到特定的子字符串之后,删去该子字符串,并且将我们指定的新字符串插入到原字符串的开头与结尾
类似于正则表达式的^与$的应用
很像是我们在第二章的操作:将字母压之后换成其他字母往后排以使得压缩持续进行
3-1 去除
相当简单的教程
1 | (start)a= |
3-2 旋转
这里只针对前面不是a进行操作,可以保证
1 | (start)b=(end)b |
3-3 A到B 2
思路
开始上难度了,但是其实不难,我们只需要先把所有特定位置的a变成特殊的,然后再处理另一边的特殊的即可
就像是我们之前做过的一样,此时的代码如下
1 | (start)a=x |
优化
我们很容易注意到我们的xa=ax或者之类的操作只是把所有符合要求的串找出来,保证不阻塞生成
于是我们注意到移到另一边的位置显然更好(指行数更小),更新之后如下
代码
1 | (start)a=(end)x |
3-5 首尾
通过上一题我们就知道弄到尾部直接判断即可
我们唯一要注意的就是判断在前,不然容易出死循环
1 | ax=(return)true #有任意一个就是真的,能迅速检查到 |
3-6 最多 2
思路
与之前的类似,但是我们需要保留所有作比较的字母来保证恢复,然后这里其实就可以
1 | ca=ac |
优化
发现ax,ay的行为是相同的,bx,by也是,优化以下
1 | ca=ac |
3-7回文串
思路
判断是不是消除之后全空即可,如3-5的加强版,我们进行全局替换,然后穷举非空情况,但是注意我们不用考虑剩下来的单个字母的情况,因为那种情况也属于回文串
1 | cz= |
挑战优化
注意到我们六行代码目的都只是为了判断是否有两个字母及以上存在
修改字符串使之存在首尾标识符即可,也就是说能保证显示出来两个字母不同且存在
1 | cuZn= |