字符串消除

题目详情

给定一个字符串,仅由a,b,c 3种小写字母组成。当出现连续两个不同的字母时,你可以用另外一个字母替换它,如


  1. 有ab或ba连续出现,你把它们替换为字母c;
  2. 有ac或ca连续出现时,你可以把它们替换为字母b;
  3. 有bc或cb 连续出现时,你可以把它们替换为字母a。


你可以不断反复按照这个规则进行替换,你的目标是使得最终结果所得到的字符串尽可能短,求最终结果的最短长度。


输入:字符串。长度不超过200,仅由abc三种小写字母组成。

输出: 按照上述规则不断消除替换,所得到的字符串最短的长度。


例如:输入cab,输出2。因为我们可以把它变为bb或者变为cc。

          输入bcab,输出1。尽管我们可以把它变为aab -> ac -> b,也可以把它变为bbb,但因为前者长度更短,所以输出1。


这个题目我没有想出来,看了网上几个高手的解答之后算是理解了,感觉自己在数学思维上还是差太远了.

首先可以举出特殊情况:即输入全是同一字符,这时的最短长度自然就是字符串的长度.

接下来看看可能的取值范围:假设字符串的开头是'a', 'b', 'c'

接下来给出'a',字符串可以转化为'a', 'b', 'b'或'c','c','a'.

接下来给出'b',字符串可以转化为'a', 'b', 'a'或'c','c','b', 或'a','a','b'.

接下来给出'c',字符串可以转化为'a', 'a', 'c'.

总之,新字符串的长度可以保证依然为3,对于"aab","aba","abb"也可以像上面一样转换,即字符串的总可以消除到3的长度(不包括"aaa"这种情形),而3长度的字符串又可以消减到1长度或2长度,即字符串的长度总可以消减到1或2.

现在引入一个特征向量(x, y, z)代表'a','b','c'字符数量的奇偶性.

1.当初状态为(1, 1, 1)即全奇时,任何一种变换都会导致三个数奇偶性同时变化(两个数量减一,一个数量加一),特征向量变为(0,0,0).

2.当初状态为(0, 0, 0)即全偶时,任何一种变换都会导致奇偶性变为(1, 1, 1).

3.当初状态为(x, y, z)(x + y + z == 1)时,任何一种变换都会导致(x, y, z)(x + y + z == 2).

4.当初状态为(x, y, z)(x + y + z == 2)时,任何一种变换都会导致(x, y, z)(x + y + z == 1).

从前文可知对于任意长度的非单一字符串,总可以缩减到3长度

此时若为"abc", 即特征向量为(1, 1, 1),再变换即可得长度为0, 0, 2的一种排列

此时若为"abb",即特征向量为(1, 0, 0), 再变换即可得长度为0, 0 ,1的一种排列.

即当初始字符串中字符的的奇偶性相同时,最短消除长度为2,其他为1.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值