返回介绍

lcci / 01.09.String Rotation / README

发布于 2024-06-17 01:04:43 字数 2470 浏览 0 评论 0 收藏 0

面试题 01.09. 字符串轮转

English Version

题目描述

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

示例1:

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

示例2:

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

    提示:

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

    说明:

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

    解法

    方法一:字符串匹配

    首先,如果字符串 $s1$ 和 $s2$ 长度不相等,那么肯定不是旋转字符串。

    其次,如果字符串 $s1$ 和 $s2$ 长度相等,那么将两个 $s1$ 连接,得到的 $s1 + s1$ 这个字符串一定包含了 $s1$ 旋转的所有情况,这时候我们只要判断 $s2$ 是否是 $s1 + s1$ 的子串即可。

    # 成立
    s1 = "aba"
    s2 = "baa"
    s1 + s1 = "abaaba"
          ^^^
    
    # 不成立
    s1 = "aba"
    s2 = "bab"
    s1 + s1 = "abaaba"
    

    时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 $s1$ 的长度。

    class Solution:
      def isFlipedString(self, s1: str, s2: str) -> bool:
        return len(s1) == len(s2) and s2 in s1 * 2
    
    class Solution {
      public boolean isFlipedString(String s1, String s2) {
        return s1.length() == s2.length() && (s1 + s1).contains(s2);
      }
    }
    
    class Solution {
    public:
      bool isFlipedString(string s1, string s2) {
        return s1.size() == s2.size() && (s1 + s1).find(s2) != string::npos;
      }
    };
    
    func isFlipedString(s1 string, s2 string) bool {
      return len(s1) == len(s2) && strings.Contains(s1+s1, s2)
    }
    
    function isFlipedString(s1: string, s2: string): boolean {
      return s1.length === s2.length && (s2 + s2).indexOf(s1) !== -1;
    }
    
    impl Solution {
      pub fn is_fliped_string(s1: String, s2: String) -> bool {
        s1.len() == s2.len() && (s2.clone() + &s2).contains(&s1)
      }
    }
    

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
    列表为空,暂无数据
      我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
      原文