文章

09 字符串轮转

字符串轮转

题目描述

字符串轮转。给定两个字符串 s1 和 s2,请编写代码检查 s2 是否为 s1 旋转而成(比如,waterbottle 是 erbottlewat 旋转后的字符串)。

示例 1:

1
2
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True

示例 2:

1
2
输入:s1 = "aa", "aba"
输出:False

提示:

字符串长度在[0, 100000]范围内。

说明:

你能只调用一次检查子串的方法吗?

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var isFlipedString = function (s1, s2) {
  if (s1.length !== s2.length) return false;
  if (!s1) return true;
  let testLength = 1;
  while (testLength <= s1.length) {
    const otherLength = s1.length - testLength;
    if (
      s1.slice(0, testLength) === s2.slice(otherLength) &&
      s1.slice(testLength) === s2.slice(0, otherLength)
    ) {
      return true;
    }
    testLength++;
  }
  return false;
};

解析

  1. 首先,如果 s1 和 s2 的长度不相等,那么肯定不是旋转字符串
  2. 其次,如果将两个 s1 字符串相连接,一定会包含旋转字符串的所有情况,此时直接判断 s2 是否为 s1+s1 的子串即可
1
2
3
function isFlipedString(s1, s2) {
  return s1.length === s2.length && (s2 + s2).indexOf(s1) !== -1;
}
本文由作者按照 CC BY 4.0 进行授权