[编程之美] 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")); 
    }
}

猜你喜欢

转载自blog.csdn.net/u013383813/article/details/83090490
3.1
今日推荐