旋转字符串:队列、顺序遍历和匹配字符串答案

2022-04-07 00:32:45
用队列、顺序遍历模拟,用匹配子字符串求解旋转字符串。

796. 旋转字符串

给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。 s 的 旋转操作 就是将 s 最左边的字符移动到最右边。 例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。

答案

模拟 · 队列

var rotateString = function(s, goal) {
  const queue = s.split('')
  let l = queue.length
  while (l--) {
    if (queue.join('') === goal) return true
    queue.push(queue.shift())
  }
  return false
};

模拟 · 顺序遍历

var rotateString = function(s, goal) {
  const n = s.length
  if (n !== goal.length) return false
  label: for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      if (s[(j - i + n) % n] !== goal[j]) continue label
    }
    return true
  }
  return false
};
func rotateString(s string, goal string) bool {
  n := len(s)
  if n != len(goal) {
    return false
  }
  label: for i := 0; i < n; i++ {
    for j := 0; j < n; j++ {
      if s[(j - i + n) % n] != goal[j] {
        continue label
      }
    }
    return true
  }
  return false
}

匹配字符串

字符串和包含匹配字符串,则字符串一定能通过旋转,得到匹配字符串

var rotateString = function(s, goal) {
  return s.length === goal.length && (s + s).includes(goal)
};
func rotateString(s string, goal string) bool {
  return len(s) == len(goal) && strings.Contains(s + s, goal)
}
RabinKarp 哈希算法:求解《1392. 最长快乐前缀》和《214. 最短回文串》
RabinKarp 哈希算法,求解《1392. 最长快乐前缀》和《214. 最短回文串》
Golang 空哈希集合和 strings.Builder:求解《824. 山羊拉丁文》
用 Golang 的空哈希集合和 strings.Builder 求解《824. 山羊拉丁文》
全排列、回溯:3 种数据结构判断能否生成回文求解《266. 回文排列》《面试题 01.04. 回文排列》递归回溯求解《267. 回文排列 II》
复习带有重复字符的全排列,3 种数据结构判断能否生成回文求解《266. 回文排列》《面试题 01.04. 回文排列》,递归回溯求解《267. 回文排列 II》