Leetcdoe-Day17-代码随想录-字符串-344-541-54-151

55. 右旋转字符串

题目链接
题解:老办法,整体反转,子串反转,三个reverse就可以解决。

#include <iostream>
using namespace std;
#include <algorithm>
int main(){
    string s;
    int n;
    cin>>n;
    cin>>s;
    reverse(s.begin(),s.end());
    reverse(s.begin(),s.begin()+n);
    reverse(s.begin()+n,s.end());
    cout<<s<<endl;
}

在这里插入图片描述

28. 找出字符串中第一个匹配项的下标

题目链接
题解:KMPf方法没有实现,周末有空的话就看看,今天时间比较紧,先把朴素方法过了。两个指针,一个在大串,一个在小串,如果指针元素相同则一起向前,否则不进入while循环,直走i。

class Solution {
public:
    int strStr(string haystack, string needle) {
        int slow,fast;
        for(int i=0;i<haystack.size();i++){
            slow=i;
            fast=0;
            while(fast<needle.size()&&haystack[slow]==needle[fast]){
                slow++;
                fast++;
            }
            if(fast==needle.size()) return i;
        }
        return -1;
    }
};

在这里插入图片描述
看起来时间复杂度是够的,O(m*n),但是KMP可以做到O(m+n), 之后试一下。

459. 重复的子字符串

题目链接
题解:假设s由两部分组成:s = s1 + s2

如果s是由它的一个子串 n 重复多次构成的字符串,那么s可以分为两部分:s = kn + n 即s1 = kn; s2 = n;

S = s + s = s1 + s2 + s1 + s2
去掉第一个字符和最后一个字符 S’ = s3 + s2 + s1 + s4
如果s是由一个子串重复多次构成的字符串 ,则s2 + s1 = n + k*n = n + (k-1)n + n = kn + n = s1 + s2 --> s2 + s1 = s1 + s2 = s
故如果s是由一个子串重复多次构成的字符串,则S‘中包含s。
那么S‘=s+s从下标为1处搜索,如果s由重复子串构成,则find返回1,否则,返回s.size()。

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        return (s+s).find(s,1)!=s.size();
    }
};

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值