leetcode刷题记录-796. 旋转字符串

412 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

前言

今天的题目为简单,题目是简单,但是也是简单题并不简单,通过暴力解法很容易就能够的到答案,但是能否节省时间复杂度以优的解答方法获得答案,这才是简单题需要追求的。

每日一题

今天的题目是 796. 旋转字符串,难度为简单

  • 给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。

  • s 的 旋转操作 就是将 s 最左边的字符移动到最右边。 

  • 例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。  

示例 1:

输入: s = "abcde", goal = "cdeab"
输出: true

示例 2:

输入: s = "abcde", goal = "abced"
输出: false

 

提示:

  • 1 <= s.length, goal.length <= 100
  • s 和 goal 由小写英文字母组成

题解

暴力解法

最直接的暴力解法,通过每次去把 s 字符串进行旋转,之后和目标字符串进行对比,相等就返回true,一直到旋转了 s 字符串的长度 那么多次之后都没有碰到相等的情况,那就返回 false。

对于字符串的旋转,我们可以把最后一个字符加上第一个到倒数第二个进行拼串

/**
 * @param {string} s
 * @param {string} goal
 * @return {boolean}
 */
var rotateString = function (s, goal) {
  let n = s.length;
  for (let i = 0; i < n; i++) {
    s = s[s.length - 1] + s.substr(0, s.length - 1);
    if (s == goal) {
      return true;
    }
  }
  return false;
};

image.png

搜索子字符串

将两个s字符串拼在一起就会发现,s旋转的所有情况都会包含在这个字符串当中:

image.png

所以我们就能够把题目要求的旋转后去求得是否相等,转为去求 goal 是不是 s 的子字符串。

但是要注意一点,在通过旋转的解法是不用去在意两个字符串的长度的,因为需要两个字符串严格相等,但是用过求得子字符串这种方式,就需要去判断两个字符串的长度是否相等,否则比如像上面的字符串 ‘asd’ 就会出现 ‘asda’ 是两个 asd 拼接后的子字符串,但是并不满足题目的要求,所以还需要两个字符串长度相等。

/**
 * @param {string} s
 * @param {string} goal
 * @return {boolean}
 */
var rotateString = function(s, goal) {
    if(s.length != goal.length){
        return false
    }else{
        return  (s + s).includes(goal)
    }
};

image.png