首页 > 编程语言 >代码随想录算法训练营day04之字符串

代码随想录算法训练营day04之字符串

时间:2024-08-05 15:58:53浏览次数:23  
标签:string int 反转 训练营 随想录 day04 str 字符串 next

题目及链接:

344.反转字符串

541.反转字符串||

卡码网54.替换数字

151.翻转字符串里的单词

卡码网55.右旋字符串

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

459.重复的子字符串

344.反转字符串

太简单就不写了

541.反转字符串||

题意:

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

做题状态:

怎么就没想到用min呢,while 和if弄了半天

题解:

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.length();
        for (int i = 0; i < n; i += 2 * k) {
            reverse(s.begin() + i, s.begin() + min(i + k, n));
        }
        return s;
    }
};

卡码网54.替换数字

有点简单了

#include<bits/stdc++.h>
using namespace std;
int main(){
    string st,str="";
    cin>>st;
    for(auto ch:st){
        if(isdigit(ch)){
            str+="number";
        }
        else str+=ch;
    }
    cout<<str;
    return 0;
}

151.翻转字符串里的单词

题意:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

输入:s = "  the sky is blue      "
输出:"blue is sky the"

做题状态:

感觉很简单但就是做不出来

题解:

来自小虎的优美简介代码(个人感觉比官方写的好):

class Solution {
public:
    string reverseWords(string s) {
        int i = s.size() - 1;
        string ans;
        while(i >= 0)
        {
            int c = 0;
            while(i >= 0 && s[i] == ' ') --i;
            while(i >= 0 && s[i] != ' ')
            {
                --i;
                ++c;
            }
            if(c)
                ans += s.substr(i+1, c) + " ";
        }

        return ans.substr(0, ans.size()-1);
    }
};

总结:

做题不要着急,不要一上来就开始写,先想一想易错点,代码的思路啥的

str.substr(pos,len);返回pos开始的len长的字符串

卡码网55.右旋字符串

题意:

输入整数k和字符串str,将str的后k个置于str的前面

输入示例
2
abcdefg
输出示例
fgabcde

做题状态:

用了两个substr,一分钟不到过了

题解:

1.substr

#include<bits/stdc++.h>
using namespace std;
int main(){
    int k;
    string str;
    cin>>k>>str;
    int n=str.length();
    string s=str.substr(n-k,k);
    s+=str.substr(0,n-k);
    cout<<s;
    return 0;
}

2.reverse

其实跟189.轮转数组几乎是一个题,唯一不同在于189题的K可能会比n大,所以要取模

整体反转再分别反转,积累一下这种思路

code(from 代码随想录)

#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int n;
    string s;
    cin >> n;
    cin >> s;
    int len = s.size(); //获取长度

    reverse(s.begin(), s.end()); // 整体反转
    reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
    reverse(s.begin() + n, s.end()); // 再反转后一段

    cout << s << endl;

}

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

题意:

给两个字符串,找第二个在第一个里面出现的下标,没出现返回-1

做题状态:

不是,这题有点简单的过头咯,find一行秒

题解:

class Solution {
public:
    int strStr(string haystack, string needle) {
        return haystack.find(needle);
    }
};

459.重复的子字符串

题意:

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

做题状态:

用暴力做的,感觉做起来很别扭,看题解前没有找到简单的方法

题解:

(form随想录)

1.移动匹配

如果s满足条件,例如为abcabc,那么s+s=abcabcabcabc

那么中间必然出现s,所以删除首尾各一个字符后进行查找即可

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        string t = s + s;
        t.erase(t.begin()); t.erase(t.end() - 1); // 掐头去尾
        if (t.find(s) != std::string::npos) return true; // r
        return false;
    }
};

2.KMP算法

不会点这里看卡哥的视频

KMP理论求next数组

class Solution {
public:
    void getNext (int* next, const string& s){
        next[0] = -1;
        int j = -1;
        for(int i = 1;i < s.size(); i++){
            while(j >= 0 && s[i] != s[j + 1]) {
                j = next[j];
            }
            if(s[i] == s[j + 1]) {
                j++;
            }
            next[i] = j;
        }
    }
    bool repeatedSubstringPattern (string s) {
        if (s.size() == 0) {
            return false;
        }
        int next[s.size()];
        getNext(next, s);
        int len = s.size();
        if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {
            return true;
        }
        return false;
    }
};

总结反思:

几乎都做过,所以今天还挺轻松的,就复习了一下半个月前学的kmp算法,当时·就学了个理论,现在用在题目上了(๑•̀ㅂ•́)و✧

标签:string,int,反转,训练营,随想录,day04,str,字符串,next
From: https://blog.csdn.net/2301_79918816/article/details/140923598

相关文章

  • 代码随想录day20 || 235 二叉搜索树最近公共祖先,701 二叉搜索树插入,450,二叉搜索树删除
    235二叉搜索树最近公共祖先unclowestCommonAncestor(root,p,q*TreeNode)*TreeNode{ //本题相较于普通二叉树寻找最近公共祖先加了题设条件二叉搜索树,所以使用二叉搜索树特性 //如果root大于两个目标节点,那么目标都在root左子树 //如果root小于两个目标节点,那么目......
  • 代码随想录Day4
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]提示:链表......
  • 代码随想录二刷字符串
    代码随想录二刷字符串看leetcode这样一道题目:这道题若是用python库函数直接就秒了。但是那这道题就失去了本身的意义。题目注意事项中也说了输入字符串S可能存在前导空格、尾随空格或者单词间的多个空格。所以首先是对字符串处理。去除其中的空格。这与之前去除数组中去除特定......
  • 2024牛客暑期多校训练营5
    目录写在前面ELBHKGJ写在最后写在前面比赛地址:https://ac.nowcoder.com/acm/contest/81600。以下按个人难度向排序。妈的坐牢场啊前期除了日常战犯环节嗯吃三发之外顺的一批,后面4h一直在J上坐牢最后样例都没过呃呃呃呃,还剩1.5hdztlb大神说会K了但是以为J能调出来没......
  • 代码随想录算法训练营day03|203.移除链表元素,707.设计链表,206.反转链表
    203.移除链表元素题目链接:https://leetcode.cn/problems/remove-linked-list-elements/description/我的代码(分头节点和中间节点两种情况操作):/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val......
  • 代码随想录 day 44 最长公共子序列 | 不相交的线 | 最大子序和 | 判断子序列
    最长公共子序列最长公共子序列解题思路本题dp数组的含义是最长公共序列,而后同时遍历两个字符串,遇到相同的字母是公共子序列+1,否则取两个字符串的公共子序列中较长的一个。知识点动态规划,子序列心得没有想到比较两个字符串的公共子序列。我自己是遇到相同字母时将所有后续的......
  • 代码随想录算法训练营Day18 | Leetcode 530 二叉搜索树的最小绝对差 Leetcode 236 二
    前言今天有一道题目没写,二叉搜索树中的众数,有点太难理解了,先放一放。Leetcode530二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差-力扣(LeetCode)代码随想录题解:代码随想录(programmercarl.com)思路:二叉搜索树的性质是中序遍历为升序的,所以我们想找最小绝......
  • 代码随想录day32 || 509斐波那契数列 70爬楼梯 746使用最小花费爬楼梯
    509斐波那契数列力扣题目链接题目描述:斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1) =1F(n)=F(n-1)+F(n-2),其中n>1给定 n ,请计算 F(n) 。代码1......
  • 代码随想录day31|| 56合并区间 738 递增数字
    56合并区间 力扣题目链接题目描述:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i]=[starti,endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。示例1:输入:intervals=[[1,3],[2,6],[8,10],[1......
  • 【代码随想录】图论复习(Python版)
    深度优先搜索1.搜索过程一个方向搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)2.代码框架回溯法的代码框架:defbacktracking(参数):if终止条件:存放结果returnfor选择本层集合中的元素(树中节点孩子的数量......