一、 题目:01.09.字符串轮转
题目描述:
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例1:
输入:s1 = “waterbottle”, s2 = “erbottlewat”
输出:True
示例2:
输入:s1 = “aa”, s2 = “aba”
输出:False
提示:
字符串长度在[0, 100000]范围内。
说明:
你能只调用一次检查子串的方法吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-rotation-lcci
二、解题思路:
1.思路:
算法1:
(1)先判断s1和s2字符串长度是否相等,若不相等,返回false;
(2)如果相等,让s2和s2本身做字符串连接生成新字符串s,判断s是否包含s1;
(3)若包含,则返回true;
2.代码:
算法1:
public boolean isFlipedString(String s1, String s2) {
if(s1.length() != s2.length()) return false;//判断字符串长度是否相等
String s = s2+s2;
return s.contains(s1);
}
Leetcode原图:
补充:
其实这个题用“题目:01.02.判断是否互为字符重排”的算法同样能解:
public class T01 {
public boolean CheckPermutation(String s1, String s2) {
if(s1.length() != s2.length()) return false;//判断字符串长度是否相等
StringBuilder sm = new StringBuilder(s2);//StringBuilder类创建的字符串可以进行delete操作
for(int i = 0;i<s1.length();i++) {//依次判断s1中的字符,是否在s2中都存在
String s = String.valueOf(s1.charAt(i));//依次获取s1中的字符
int index = sm.indexOf(s);//获取字符在s2中的索引位置
if(index == -1) return false;//如果索引为-1,说明两个字符串的字符不相同
sm.deleteCharAt(index);//删除s2中已经比对过的字符
}
return true;
}
只不过这个算法复杂度要高一些