leetcode每日一题——循环字符串

循环字符串

题目

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

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

示例二

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

自己的解答

直接将s字符串进行旋转,旋转的操作是使用temp来记录字符串的第一个字符,然后使用一个循环将所有的字符串都向前移动,最后将使最后一个字符=temp
代码使用两层循环,内层循环用于旋转字符串,外层循环用于判断旋转字符串何时停止,即当s==goal或者count==s.length()

class Solution {
public:
    bool rotateString(string s, string goal) {
        int i,temp;
        int count=0;
        while(s!=goal&&count!=s.length()){
            temp=s[0];
            for(i=0;i<s.length();i++){
                s[i]=s[i+1];
            }
            s[s.length()-1]=temp;
            count++;
        }
        return s==goal;

    }
};

结果

在这里插入图片描述

官方答案

官方的答案是先判断两个字符串长度是否一致,如果不一致,那么不管怎么旋转两个字符串都不会相同。
然后考虑旋转,同样采用了两层循环,主要使旋转部分并没有改变字符串s,只是单纯计算旋转后的某一个字符
在长度一样(都为 n)的前提下,假设 s 旋转 i 位,则与 goal 中的某一位字符 goal[j] 对应的原 s 中的字符应该为s[(i+j) mod n]。在固定 i 的情况下,遍历所有 j,若对应字符都相同,则返回 true。否则,继续遍历其他候选的 i。若所有的 i 都不能使 s 变成 goal,则返回 false

class Solution {
public:
    bool rotateString(string s, string goal) {
        int m = s.size(), n = goal.size();
        if (m != n) {
            return false;
        }
        for (int i = 0; i < n; i++) {
            bool flag = true;
            for (int j = 0; j < n; j++) {
                if (s[(i + j) % n] != goal[j]) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                return true;
            }
        }
        return false;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/rotate-string/solution/xuan-zhuan-zi-fu-chuan-by-leetcode-solut-4hlp/
来源:力扣(LeetCode)

反思

  1. 没有考虑字符串长度不一致的情况
  2. 直接暴力求解

题目链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值