首页 > 编程语言 >代码随想录算法训练营第九天|LeetCode151.翻转字符串里的单词、卡码网:55.右旋转字符串、LeetCode28.实现strStr()、459.重复的子字符串

代码随想录算法训练营第九天|LeetCode151.翻转字符串里的单词、卡码网:55.右旋转字符串、LeetCode28.实现strStr()、459.重复的子字符串

时间:2024-11-07 21:20:53浏览次数:3  
标签:第九天 string int needle 随想录 ++ Length 字符串

前言

打卡代码随想录算法训练营第49期第九天︿( ̄︶ ̄)︿

首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。


今日题目

LeetCode 151 翻转字符串里的单词

题目链接:151 翻转字符串里的单词

文章讲解:翻转字符串里的单词

视频讲解:卡哥讲解 —— 翻转字符串里的单词

本题真的会让我PTSD,在没有知道卡哥之前就做过,给我做的是神志不清啊,看了卡哥之后又看到这道题还是会很恐惧,每次都会做错。

这道题的重点是去除字符串里的“ ”字符,且让整个单词位置切换,去除空字符可以直接使用双指针和去除目标数字一个原理。然后翻转单词可以先单独翻转单词字符串,然后再将整体翻转即可得到目标。

public class Solution {
    public string ReverseWords(string s) {
        int slow = 0;//慢指针
        char[] cc = s.ToArray<char>();
        for(int fast = 0; fast < s.Length; fast++)
        {
            if(cc[fast] != ' ')
            {
                if(slow != 0)//除了第一次前面没有空格 剩下所有单词前面都有空格
                    cc[slow++] = ' ';
                while(fast < s.Length && s[fast] !=' ')
                {
                    cc[slow++] = cc[fast];
                    fast++;
                }       
            }
        }
        char[] c = new char[slow];
        for(int i = 0; i < slow; i++)
            c[i] = cc[i];
        string ss = new string(c);
        string[] strs = ss.Split(" ");
        string res = "";
        for(int i = strs.Length - 1; i > 0; i--)
        {
            res += strs[i];
            res += " ";
        }
        res += strs[0];
        return res;
    }
}

卡码网 55.右旋转字符串

题目链接:右旋转字符串

文章讲解:右旋转字符串

本题和Leetcode189一样的 轮转数组这里使用卡码网的思想和上体一样,先翻转0 - Length - n的数组,再翻转n - Length的数组,最后再整体翻转即可。

#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.begin() + len - n); // 先反转前一段,长度len-n ,注意这里是和版本一的区别
    reverse(s.begin() + len - n, s.end()); // 再反转后一段
    reverse(s.begin(), s.end()); // 整体反转
    cout << s << endl;
}

轮转数组解法 

public class Solution {
    public void Rotate(int[] nums, int k) {
        int[] temp = new int[nums.Length];
        //申明临时数组
        for(int i = 0; i < nums.Length; i++)
            temp[i] = nums[i];
        //进行轮转赋值
        for(int i = 0; i < nums.Length; i++)
            nums[(i + k) % nums.Length] = temp[i];
    }
}

LeetCode 28 实现strStr()

题目链接:28. 实现 strStr()

文章讲解:实现 strStr()(KMP算法)

视频讲解:KMP1KMP2

在字符串匹配这里一直有个大头是KMP算法,可以说是十分的抽象,我看了几遍理解也不是十分到位,直接看视频就完事了。

public class Solution {
    public int StrStr(string haystack, string needle) {
        int[] next = GetNext(needle);
        int i = 0;//对应haystack的位置
        int j = 0;//对应needle的位置
        while(i < haystack.Length)
        {
            if(haystack[i] == needle[j])
            {
                i++;
                j++;
            }
            if(j == needle.Length)//j == needle.Length代表匹配到了目标字符串
                return i - j;
            else if(i < haystack.Length && haystack[i] != needle[j])
            {
                if(j != 0)
                    j = next[j - 1];
                else
                    i++;
            }
        }
        return -1;
    }
    //求得next数组
    public int[] GetNext(string needle)
    {
        int[] next = new int[needle.Length];
        int j = 0;
        next[0] = j;
        for(int i = 1; i < needle.Length; i++)
        {
            while(j > 0 && needle[i] != needle[j])
                j = next[j - 1];//回退到上一位next数组的值的位置
            if(needle[i] == needle[j])
                j++;
            next[i] = j;
        }
        return next;
    }
}

LeetCode 459 重复的子字符串

题目链接:459 重复的子字符串

文章讲解:重复的子字符串

视频讲解:卡哥讲解 —— 重复的子字符串

本题卡哥还是想用KMP算法来做,但是因为上一题使用过了,所以这里简单一点就直接上简单的首尾相连方式。

public class Solution {
    public bool RepeatedSubstringPattern(string s) {
        string ss = s + s;//首尾相连
        char[] c = ss.ToArray<char>();
        c[0] = ' ';//首字符置空
        c[c.Length - 1] = ' '; //尾字符置空
        string newString = new string(c);
        if(newString.Contains(s))//如果新字符串包含旧字符串即可判断为重复字符串
            return true;
        return false;
    }
}

今天的KMP算法是真的虐啊,下次看到不知道能不能吃透,明天见~~~

标签:第九天,string,int,needle,随想录,++,Length,字符串
From: https://blog.csdn.net/tancxiaohei23/article/details/143594705

相关文章

  • 代码随想录算法训练营 day37 day38| 卡码网52.完全背包 518. 零钱兑换 II 377.
    学习资料:https://programmercarl.com/背包问题理论基础完全背包.html#算法公开课相比于01背包,完全背包中每个物品都可以无限次的放入组合:先遍历物品,再逆序遍历背包排列:先逆序遍历背包,再遍历物品学习记录卡码网52.携带研究资料(dp[i]代表当重量为i时的最大价值)点击查看代码n......
  • ton jetton 发送字符串的方式
    func(tTonApiServiceImpl)TransferToken(ctxcontext.Context,tokenContractAddrstring,toAddrstring,amountbig.Int)(string,error){ recipientAddr:=tongo.MustParseAddress(toAddr) w,err:=wallet.DefaultWalletFromSeed(t.cfg.LotteryOwnerSeed,t.lc......
  • 代码随想录一刷day7 哈希表day1
    遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。常见三种实现哈希表的数据结构:数组set集合map映射下面是setmap的红黑树是一种平衡二叉搜索树,所以k......
  • 代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四
    资源引用:leetcode题目:454.四数相加Ⅱ(454.四数相加II-力扣(LeetCode))383.赎金信(383.赎金信-力扣(LeetCode))15.三数之和(15.三数之和-力扣(LeetCode))18.四数之和(18.四数之和-力扣(LeetCode))例行碎碎念:今天也追赶上了一些进度,虽然生病感冒,但今天很好的坚持了从早到晚......
  • python统计字符串中单个字符出现次数
    str='skdaskerkjsalkj'list=[]foriinrange(len(str)):list.append(str[i])list2=sorted(list)print(list2)foriinrange(len(list)):flag2=Falsest=list2[i]k=i-1#是不是第一个whilek>=0:if(li......
  • 代码随想录算法训练营第十八天|leetcode530.二叉搜索树的最小绝对差、leetcode501.二
    1leetcode530.二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差-力扣(LeetCode)文章链接:代码随想录视频链接:你对二叉搜索树了解的还不够!|LeetCode:98.验证二叉搜索树_哔哩哔哩_bilibili思路:定义一个极大值作为结果,然后在中序遍历过程中进行比较出结果1.1自己的......
  • MySQL 字符串索引和前缀索引
    前缀索引创建前缀索引altertabletaddindexidx_email(email);altertabletaddindexidx_email(email(6));使用前缀索引,定义好长度,可以做到即节省空间,又不用额外增加太多查询成本。区分度建立索引时,区分度(不重复的值)越高越好。selectcount(distanceemail)fromt......
  • python之base64与字符串互相转化
    importbase64defstring_to_base64(input_string:str)->str:"""将字符串转换为Base64编码。参数:input_string(str):要转换的字符串。返回:str:Base64编码后的字符串。"""#将字符串转换为字节byte_data=input_string......
  • 讲解Java字符串
    字符串1.字符串的创建(1)字面量创建(2)使用`new`关键字2.字符串的不可变性3.字符串池(StringPool)4.String类的常用方法(1)`length()`(2)`charAt(intindex)`(3)`substring(intstart)`和`substring(intstart,intend)`(4)`toUpperCase()`和`toLowerC......
  • 代码随想录打卡Day14
    1.力扣226:翻转二叉树题目描述:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]解答代码:/***Definitionforabin......