【算法集训 | 暑期刷题营】8.13题---字符串

简介: 【算法集训 | 暑期刷题营】8.13题---字符串

 👉引言


铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉


💖 ❄️我们的算法之路❄️💖


   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。

☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️

💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs) ,💝宽度优先搜索(bfs) ,💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉

image.png


今日主题:字符串


 👉⭐️第一题💎


   ✨题目


     1.反转字符串||

image.png

   ✨思路:


简单的字符串模拟题,简单来说就是翻转前K个字符,前后指针边向中间遍历边交换,可以自定义一个swap(),对于C++来说可以直接用STL的reverse函数


   ✨代码:


class Solution {
    public String reverseStr(String s, int k) {
        char[] cs = s.toCharArray();
        int n = s.length();
        for (int l = 0; l < n; l = l + 2 * k) {
            int r = l + k - 1;
            reverse(cs, l, Math.min(r, n - 1));
        }
        return String.valueOf(cs);
    }
    void reverse(char[] cs, int l, int r) {
        while (l < r) {
            char c = cs[l];
            cs[l] = cs[r];
            cs[r] = c;
            l++; r--;
        }
    }
}


 👉⭐️第二题💎


   ✨题目


      2.裁剪数字后查询第k小的数字

image.png


   ✨思路:


数字字符串都是等长的,把索引拼接到数据上。比较大小时,传入。nums[0].length()-queries[i][1]就是从截取位置之后开始比较。这样好处是在不稳定的排序中后面拼接的索引确保了,每一个数据的唯一性,所以即使不稳定,它也可以正确的找出第k小。这就为选用选择排序铺平了道路。这里我们选择归并排序。


   ✨代码:


class Solution {
public:
    vector<int> smallestTrimmedNumbers(vector<string> &nums, vector<vector<int>> &queries) {
        vector<int> ans(queries.size());
        int n = nums.size(), m = nums[0].length();
        int idx[n];
        for (int i = 0; i < queries.size(); ++i) {
            auto &q = queries[i];
            iota(idx, idx + n, 0);
            stable_sort(idx, idx + n, [&](int a, int b) {
                auto &s = nums[a], &t = nums[b];
                for (int j = m - q[1]; j < m; ++j)
                    if (s[j] != t[j]) return s[j] < t[j];
                return false;
            });
            ans[i] = idx[q[0] - 1];
        }
        return ans;
    }
};


 👉⭐️第三题💎


   ✨题目


      3.设置文本编辑器

image.png


   ✨思路:


用两个栈模拟光标的移动,右边的栈,下标顺序是逆序的,这样,往右边放入或取字符时,才可以直接在栈顶位置进行操作,左边的栈顶位置,记得补充一个结束符,这样,在光标左移、右移的操作过程中,需要返回左侧至多10个字符时,可以直接返回子字符串的开始下标,到结束符为止即可输出


   ✨代码:


#define MAX_STACKSIZE 800000
#define ATMOST_LENGTH 10
#define MIN_VALUE(x, y) (((x) < (y)) ? (x) : (y))
/* leftSize表示左侧栈已用空间,left表示左侧栈,rightSize表示右侧栈已用空间,right表示右侧栈。 */
typedef struct
{
    int leftSize;
    int rightSize;
    char *left;
    char *right;
}
TextEditor;
/* 创建对象,并初始化。 */
TextEditor *textEditorCreate()
{
    TextEditor *obj = (TextEditor *)malloc(sizeof(TextEditor));
    obj->leftSize = 0;
    obj->rightSize = 0;
    obj->left = (char *)malloc(sizeof(char) * MAX_STACKSIZE);
    obj->right = (char *)malloc(sizeof(char) * MAX_STACKSIZE);
    return obj;
}
/* 从光标所在位置开始,插入文本。 */
void textEditorAddText(TextEditor *obj, char *text)
{
    int x = 0;
    /* 此时只需要操作左侧栈。 */
    while('\0' != text[x])
    {
        obj->left[obj->leftSize] = text[x];
        obj->leftSize++;
        x++;
    }
    /* 栈顶位置用结束符补充。 */
    obj->left[obj->leftSize] = '\0';
    return;
}
/* 删除k个字符。 */
int textEditorDeleteText(TextEditor *obj, int k)
{
    /* 左侧栈不足k个时,全部删光。 */
    int x = MIN_VALUE(obj->leftSize, k);
    obj->leftSize -= x;
    /* 栈顶位置用结束符补充。 */
    obj->left[obj->leftSize] = '\0';
    return x;
}
/* 光标向左移动k次。 */
char *textEditorCursorLeft(TextEditor *obj, int k)
{
    int index = 0;
    /* 每移动一次,左侧栈顶的字符就移动到右侧栈顶。 */
    while(0 < k && 0 < obj->leftSize)
    {
        obj->leftSize--;
        obj->right[obj->rightSize] = obj->left[obj->leftSize];
        obj->rightSize++;
        k--;
    }
    /* 栈顶位置用结束符补充。 */
    obj->left[obj->leftSize] = '\0';
    /* 返回左侧长度最多为10的子字符串。 */
    if(ATMOST_LENGTH < obj->leftSize)
    {
        index = obj->leftSize - ATMOST_LENGTH;
    }
    return &obj->left[index];
}
/* 光标向右移动k次。 */
char *textEditorCursorRight(TextEditor *obj, int k)
{
    int index = 0;
    /* 每移动一次,右侧栈顶的字符就移动到左侧栈顶。 */
    while(0 < k && 0 < obj->rightSize)
    {
        obj->rightSize--;
        obj->left[obj->leftSize] = obj->right[obj->rightSize];
        obj->leftSize++;
        k--;
    }
    /* 栈顶位置用结束符补充。 */
    obj->left[obj->leftSize] = '\0';
    /* 返回左侧长度最多为10的子字符串。 */
    if(ATMOST_LENGTH < obj->leftSize)
    {
        index = obj->leftSize - ATMOST_LENGTH;
    }
    return &obj->left[index];
}
/* 释放对象。 */
void textEditorFree(TextEditor *obj)
{
    free(obj->left);
    free(obj->right);
    free(obj);
    return;
}


 👉⭐️第四题💎


   ✨题目


     4. Roof Construction


image.pngimage.png


   ✨代码:


#include<bits/stdc++.h>
using namespace std;
int main() {
    int t;
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        int k = 0;
        while((1 << (k + 1)) <= n - 1) ++k; 
        for(int i = (1 << k) - 1; i >= 0; i--) {
            cout << i << ' ';
        }
        for(int i = (1 << k); i < n; i++) {
            cout << i << ' ';
        }
        cout << '\n';
    }
}

🌹写在最后💖

相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!🌹🌹🌹


相关文章
|
4月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
2月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
103 1
两个字符串匹配出最长公共子序列算法
|
2月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
22 0
|
4月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
5月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
321 1
|
5月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
141 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
4月前
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
|
4月前
|
算法 Python
【Leetcode刷题Python】改进的算法,高效求一个数的因子
一个高效的Python函数用于找出一个整数的所有因子,通过仅遍历到该数平方根的范围来优化性能。
50 0
|
4月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
92 0
|
5月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用