这是这次算法作业里逻辑最简单的。。。但是我还是只想到了暴力我好蠢。。。
问题
给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含。例如,S1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。
分析
最初想法十分愚蠢,大概就是换一次顺序就比较一次,是否包含。
这样每次都要比较,时间复杂度就是O(n2)
但是,万能的某度给了我新思路,既然是循环位移,那就是说…
ABCD—>ABCDA---->ABCDAB---->ABCDABC---->ABCDABCD……
我在后面加上个自己,从不同的位置开始数,就是不同的循环位移串了,就包含了所有情况啊!!!!(而且复杂度还是O(n))
代码
/**
* @ClassName RotateString
* @Description 字符串移位包含问题
* 给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含。
* 例如,S1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。
* @author 滑技工厂 https://blog.csdn.net/qq_41718454
* @date 2020/3/7
* @version 1.0
*/
public class RotateString {
/*
* @Title rotate
* @Description 方法
* @author 滑技工厂
* @Date 2020/3/7
* @param [s1, s2]
* @return boolean
* @throws
*/
public static boolean rotate(String s1, String s2) {
//创造一个s1,从不同的位置就是各个循环位移后的串
s1 += s1;
//比较
if (s1.contains(s2))
return true;
else
return false;
}
public static void main(String[] args) {
System.out.println(rotate("AABCD", "CDAA"));
}
}
就这样愉快的结束了