字符串—给定isSubstring方法,判断一个字符串是否由另一个字符串翻转得到

该博客讨论如何利用KMP算法解决一个问题:判断一个字符串是否由另一个字符串翻转得到。通过分析字符串的特性,如abc和cab,可以发现它们由相同部分的不同拼接顺序构成。若S2是S1的翻转,那么S2必然是S1S1的子串。因此,只需实现KMP算法检查S2是否为S1S1的子串即可。
摘要由CSDN通过智能技术生成

问题

给定isSubstring方法(经典的KMP算法,下面仅给出最一般的实现方式,在另一篇中专门解读KMP),判断一个字符串是否由另一个字符串翻转得到,例如abc,cab。

分析

  • 如果符合题目条件,例如对于abc, cab他们有一些特征,这两个串都是由 ab 和 c 拼接得到的,只是拼接的顺序不同而已。
  • 所以存在下面的规律,S2是否是S1旋转得到,如果是则需要保证S2是S1S1的子串:
    • S1 = xy
    • S2 = yx
    • S1S1 = xyxy
    • S2是S1的子串
  • 这样分析好之后实现就很简单了,只需要判断S2是否是S1S1的子串就可以,这里判断子串的方法是经典的KMP问题,此处仅给出最一般的o(nk)的算法,随后会详细分析KMP算法。

实现

/**
     * 1.8 问题:给定isSubstring方法(经典的KMP算法,下面仅给出最一般的实现方式,在另一篇中专门解读KMP),判断一个字符串是否由另一个字符串翻转得到,例如abc,cab
     * 思路:S2是否是S1旋转得到,如果是则需要保证S2是S1S1的子串
     * S1 = xy
     * S2 = yx
     * S1S1 = xyxy
     * S2是S1的子串
     */
    publi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值