[编程之美] 3.1 字符串循环移位包含

题目

s1 = AABCD, s2 = CDAA
Return : true
给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含。

思路

以S1 = ABCD 为例,对其循环移位的后果为:
ABCD -> BCDA -> CDAB -> DABC -> ABCD
S1S1 = ABCDABCD
看出对S1做循环移位所得到的字符串都将是字符串S1S1的子字符串。那么判断 若 S2 为 S1S1的子串,那么 s2 一定 能够被 s1 做循环移位得到的字符串包含。

参考:

ps:其实 不用 S1S1,用S1S1[0:-1] 便可以。

Note:

不占用 额外空间的方法 :
在s1后面"虚拟"地接上一个s1,这个"虚拟的s1"并不占空间,但是仍然按照解法2的思路进行。那么,如何实现这个"虚拟的s1"呢?其实只要把s1的最后一个元素,再指回s1的第一个元素即可。这可以用取模运算实现。比如,元素s1[(d1+i) mod d1]其实就是那个“虚拟的s1”的第i个元素,这里 0<=i<=d1-1, d1是字符串s1的长度。

参考:https://www.cnblogs.com/sooner/p/3270548.html

class Solution {
    public boolean IsRotate(String str1,String str2) {
        String fStr  = str2 + str2.substring(0,str2.length()-1);
        if(fStr.indexOf(str1)!=-1)  return true;
        else    return false;
    }
}
public class Main {
    public static void main(String[] args) {
        int[] a = {1,5,11,5};
        Solution s = new Solution();
        System.out.println(s.IsRotate("CDAA","AABCD")); 
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值