背景
这是《编程之美》一书中3.1节字符串移位包含问题的Java实现。
题目
给定两个字符串s1和s2, 要求判定s2是否能够被通过s 作循环移位 ( rotate )得到的字符串包含。例如, 给定s1 = AABCD和s2 = CDAA,返回 true;给定s1 = ABCD和s2 = ACBD, 返回 false。
Java实现
暴力求解
最直接的方法就是对s1进行循环移位,再进行字符串包含的判断,从而遍历其所有的可能性。
空间换时间
通过观察可以发现,只要判断s2是否在两个s1中就可以了。下面给出Java实现:
import java.util.*;
public class Stringshift {
public static boolean contains(String src, String dst) {
String srcsrc = src.concat(src);
if (srcsrc.contains(dst)) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Scanner in2 = new Scanner(System.in);
String s1 = in.nextLine();
String s2 = in2.nextLine();
System.out.println(contains(s1, s2));
}
}
折中
还有一种方法就是不用申请过多的空间,直接对s1循环来比较,超过了就取余,也就是相当于延长了字符串了。