当前位置: 首页 > news >正文

LeetCode 面试题 01.09. 字符串轮转

文章目录

  • 一、题目
  • 二、C# 题解

一、题目

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

  点击此处跳转题目。

示例1:

输入:s1 = “waterbottle”, s2 = “erbottlewat”
输出:True

示例2:

输入:s1 = “aa”, s2 = “aba”
输出:False

提示:

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

说明:

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

二、C# 题解

  可以将题目理解为从字符串内部切一刀换序重组,判断是否能变为原字符串。但按照该思路写复杂度为 O ( n 2 ) O(n^2) O(n2),不是很理想,因此还是从字符入手。

  使用双指针 i,j 从左向右分别指向 s1,s2i 的任务是遍历 s1,查找 s2s1 中的前缀;j 的任务是标识 s2 中前缀的位置,即 s2[0]~s2[j - 1]s2s1 相同的部分。

  以 s1:bunana, s2:nabuna 为例,可以看出,s1:buna | nas2:na | bunas1 的后缀和 s2 的前缀想同,均为 na,算法的具体流程如下:

b u n a n a ( s 1 ) i : ↑ n a b u n a ( s 2 ) j : ↑ ⇓ b u n a n a ( s 1 ) i : ↑ n a b u n a ( s 2 ) j : ↑ ⇓ b u n a n a ( s 1 ) i : ↑ n a b u n a ( s 2 ) j : ↑ ⇓ b u n a n a ( s 1 ) i : ↑ n a b u n a ( s 2 ) j : ↑ ⇓ b u n a n a ( s 1 ) i : ↑ n a b u n a ( s 2 ) j : ↑ ⇓ b u n a n a ( s 1 ) i : ↑ n a b u n a ( s 2 ) j : ↑ ⇓ b u n a n a ( s 1 ) i : ↑ n a b u n a ( s 2 ) j : ↑ \begin{array}{l} & b & u & n & a & n & a & (s1)\\ i:& \uparrow & & & & \\ & n & a & b & u & n & a & (s2)\\ j:& \uparrow & & & & \end{array}\\ ~\\\ \Downarrow\\ ~\\\ \begin{array}{l} & b & u & n & a & n & a & (s1)\\ i:& & \uparrow & & & \\ & n & a & b & u & n & a & (s2)\\ j:& \uparrow & & & & \end{array}\\ ~\\\ \Downarrow\\ ~\\\ \begin{array}{l} & b & u & n & a & n & a & (s1)\\ i:& & & \uparrow & & \\ & n & a & b & u & n & a & (s2)\\ j:& \uparrow & & & & \end{array}\\ ~\\\ \Downarrow\\ ~\\\ \begin{array}{l} & b & u & n & a & n & a & (s1)\\ i:& & & & \uparrow & \\ & n & a & b & u & n & a & (s2)\\ j:& & \uparrow & & & \end{array}\\ ~\\\ \Downarrow\\ ~\\\ \begin{array}{l} & b & u & n & a & n & a & (s1)\\ i:& & & & & \uparrow \\ & n & a & b & u & n & a & (s2)\\ j:& \uparrow & & & & \end{array}\\ ~\\\ \Downarrow\\ ~\\\ \begin{array}{l} & b & u & n & a & n & a & (s1)\\ i:& & & & & & \uparrow \\ & n & a & b & u & n & a & (s2)\\ j:& & \uparrow & & & \end{array}\\ ~\\\ \Downarrow\\ ~\\\ \begin{array}{l} & b & u & n & a & n & a & (s1)\\ i:& & & & & & & \uparrow \\ & n & a & b & u & n & a & (s2)\\ j:& & & \uparrow & & \end{array}\\ i:j:bnuanbaunnaa(s1)(s2)    i:j:bnuanbaunnaa(s1)(s2)    i:j:bnuanbaunnaa(s1)(s2)    i:j:bnuanbaunnaa(s1)(s2)    i:j:bnuanbaunnaa(s1)(s2)    i:j:bnuanbaunnaa(s1)(s2)    i:j:bnuanbaunnaa(s1)(s2)

  最终,i 指向 s1 的末尾,j 指向 s2 前缀的后一字符,即 s2 后缀的起始位置。

public class Solution {public bool IsFlipedString(string s1, string s2) {int l1 = s1.Length, l2 = s2.Length;if (l1 != l2) return false;  // 长度不相等直接否掉int i = 0, j = 0;            // 双指针,i 指 s1,j 指 s2while (i < l1) {             // 遍历 s1,寻找 s2 的前缀if (s1[i] == s2[j]) j++; // 如果字符相同,则 j 后移else {                   // 字符不同,则 i、j 回退i -= j;j = 0;}i++;                     // i 始终前进}i = 0;while (j < l2) {             // 检查 s2 后缀是否为 s1 前缀if (s1[i++] != s2[j++]) return false;}return true;}
}
  • 时间复杂度:一般情况下为 O ( n ) O(n) O(n),但波动较大。最坏情况为 O ( n 2 ) O(n^2) O(n2),即字符串包含大部分重复字符。可以使用 KMP 算法优化,懒了没必要。
  • 空间复杂度: O ( 1 ) O(1) O(1)
http://www.lryc.cn/news/139919.html

相关文章:

  • 系统上线安全测评需要做哪些内容?
  • vue 中 axios 的安装及使用
  • 数据结构——线性数据结构(数组,链表,栈,队列)
  • 多态(C++)
  • 算法leetcode|73. 矩阵置零(rust重拳出击)
  • axios 二次封装
  • Rust安全之数值
  • 4种方法实现html 页面内锚点定位及跳转
  • gitlab配置备忘
  • 基于Centos搭建k8s仓库
  • 浅谈泛在电力物联网发展形态与技术挑战
  • git reset --soft 用法
  • 哪些测试仪器可以用于检测静电中和设备的性能
  • 浅析 GlusterFS 与 JuiceFS 的架构异同
  • ARM开发,stm32mp157a-A7核PWM实验(驱动蜂鸣器,风扇,马达工作)
  • 群狼调研(长沙眼镜店神秘顾客)|消费者需求研究方案
  • 电脑入门:宽带路由器常见故障排除技巧
  • 基于云原生网关的流量防护实践
  • 开源与云计算:新的合作模式
  • 前端需要理解的跨平台知识
  • 《基于 Vue 组件库 的 Webpack5 配置》3.将 CSS 提取到单独的文件
  • 2023CCF图形学启明星计划夏令营感想记录
  • 如何解决“缺失msvcp110.dll”错误,msvcp110.dll丢失要怎样才能修复
  • 激活函数总结(二十):激活函数补充(SQNL、PLU)
  • Docker【部署 04】Docker Compose下载安装及实例Milvus Docker compose(CPU)使用说明分享
  • 23种设计模式-7种结构模式
  • 大数据Flink(六十七):SQL Table 简介及运行环境
  • WPF使用依赖注入
  • 玩转科技|了解AI平台桌面客户端—ChatBox
  • visual studio 2022.NET Core 3.1 未显示在目标框架下拉列表中