持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
刷题的日常-2022年9月29日
一天一题,保持脑子清爽
字符串轮转
来自leetcode的 面试题 01.09 题,题意如下:
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例一:
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
示例二
输入:s1 = "aa", s2 = "aba"
输出:False
理解题意
我们可以从题意中提取的条件如下:
- 题目给出两个字符串
- 要求我们判断字符串是不是旋转后的字符串
- 旋转字符串是源字符串往后一直走,最后的字符拼接到前面
做题思路
这里我们可以有两种方法来做判断:暴力,字符串拼接
暴力搜寻
我们可以先判断两个字符串的长度是否一致,如果一致则直接返回false。如果长度一致,我们就需要遍历字符串,找出相同的位置,然后根据长度往后判断对应的字符是否相等,需要注意的是越界的情况需要对索引进行取模。这种方法的时间复杂度是O(n^2)
字符串拼接
字符串s1在某个地方进行了旋转得到s2,我们可以知道,旋转后的s2拼接两次一定可以有包含s1,如用例1所示,"erbottlewat"拼接两次可以得到"erbottlewaterbottlewat",中间就包括了原始的字符串"waterbottle",所以,我们只需要判断拼接后的字符串是否包换原始字符串就行,步骤如下:
- 判断两个字符串是否相同,如果不同就返回false
- 将翻转后的字符串相加
- 判断相加后的字符串是否包含原始字符串
- 返回判断结果
代码实现
代码实现如下:
public class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1.length() != s2.length()) {
return false;
}
s2 += s2;
return s2.contains(s1);
}
}