本文主要是介绍[编程之美] 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")); }
}
这篇关于[编程之美] 3.1 字符串循环移位包含的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!