首页 > 编程语言 >算法笔记|Day8字符串II

算法笔记|Day8字符串II

时间:2024-07-26 20:27:24浏览次数:28  
标签:ch charAt Day8 int next II 算法 right 字符串

算法笔记|Day8字符串II

☆☆☆☆☆leetcode 151.翻转字符串里的单词

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

题目分析

1.此题需要完成三个步骤:移除多余空格,将整个字符串反转,将每个单词反转;
2.移除空格需要注意:首尾的空格应删掉,每两个单词之间要保留一个空格,同时为了保证删去多余的元素,应该对数组重新resize;
3.时间复杂度为O(n),空间复杂度为O(1)。

代码

class Solution {
    public String reverseWords(String s) {
        char ch[]=s.toCharArray();
        ch=removeSpaces(ch);
        reverse(ch,0,ch.length-1);
        reverseEachWord(ch);
        return new String(ch);
    }

    public char[] removeSpaces(char[] ch){
        int slow=0,fast=0;
        for(;fast<ch.length;fast++){
            if(ch[fast]!=' '){
                if(slow!=0){
                    ch[slow]=' ';
                    slow++;
                }
                while(fast<ch.length&&ch[fast]!=' '){
                    ch[slow]=ch[fast];
                    slow++;
                    fast++;
                }
            }
        }
        char newch[]=new char[slow];//相当于resize
        for(int index=0;index<slow;index++){
            newch[index]=ch[index];
        }
        return newch;
    }
    
    public void reverseEachWord(char[] ch){
        int left=0,right=0;
        for(;right<=ch.length;right++){
            if(right==ch.length||ch[right]==' '){
                reverse(ch,left,right-1);
                left=right+1;
            }
        }
    }
    
    public void reverse(char[] ch,int left,int right){
        while(left<right){
            char temp=ch[left];
            ch[left]=ch[right];
            ch[right]=temp;
            left++;
            right--;
        }
    }
}

☆☆☆☆kamacoder 55. 右旋字符串(待补充)

题目链接:kamacoder 55. 右旋字符串

题目分析

代码


☆☆☆☆☆leetcode 28. 实现 strStr()

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

题目分析

1.本题为KMP经典题目,其思想为:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配;
2.前缀表(next数组)是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配,其第i个元素为记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀;
3.时间复杂度为O(n + m),空间复杂度为O(m)。

代码

class Solution {
    public int strStr(String haystack, String needle) {
        int next[]=new int[needle.length()];
        getNext(needle,next);
        int j=0;
        for(int i=0;i<haystack.length();i++){
            while(j>0&&needle.charAt(j)!=haystack.charAt(i))
                j=next[j-1];
            if(needle.charAt(j)==haystack.charAt(i))
                j++;
            if(j==needle.length())
                return i-needle.length()+1;        
        }
        return -1;
    }

    private void getNext(String s,int[] next){
        int j=0;
        next[0]=0;
        for(int i=1;i<s.length();i++){
            while(j>0&&s.charAt(j)!=s.charAt(i))
                j=next[j-1];
            if(s.charAt(j)==s.charAt(i))
                j++;
            next[i]=j;
        }
    }
}

☆☆☆☆☆leetcode 459.重复的子字符串

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

题目分析

1.本题可以用字符串匹配的方法,判断s+s拼接的字符串中间是否出现一个s的的时候,注意需要刨除s+s的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s,此方法可以用到库函数,但时间复杂度较高;
2.本题还可以考虑KMP方法,数组长度减去最长相同前后缀的长度相当于是第一个周期的长度,也就是一个周期的长度,如果这个周期可以被整除,就说明整个数组就是这个周期的循环,即返回true,否则返回false;
3.时间复杂度为O(n),空间复杂度为O(n)。

代码

1.字符串匹配的方法
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        String t = s + s;  
        t = t.substring(1, t.length() - 1); // 掐头去尾  
        if (t.contains(s)) 
            return true;  
        return false;  
    }
}
2.KMP方法
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int len=s.length();
        int next[]=new int[len];
        int j=0;
        next[0]=0;
        for(int i=1;i<s.length();i++){
            while(j>0&&s.charAt(j)!=s.charAt(i))
                j=next[j-1];
            if(s.charAt(j)==s.charAt(i))
                j++;
            next[i]=j;
        }
        if(next[len-1]>0&&len%(len-next[len-1])==0)
            return true;
        return false;
    }
}

标签:ch,charAt,Day8,int,next,II,算法,right,字符串
From: https://blog.csdn.net/m0_57632621/article/details/140693557

相关文章

  • 2024“钉耙编程”中国大学生算法设计超级联赛(3)
    Preface徐神是我们的红太阳,最后2min切了一道极难的string使得在这场前期爆炸的局面最后没有崩得太难看这场前期的开题顺序有点问题导致前5题出的很慢,中后期开始三人一人写一题,然后经典三开三卡好在最后我在WA了五发后写对拍把B过了,徐神又压线过了string,但比较可惜的......
  • ios CCUIImage.m
    ////CCUIImage.h//CCFC_IPHONE////#ifndefCC_UI_IMAGE_H#defineCC_UI_IMAGE_H#ifdef__OBJC__#import"CCConfig.h"#defineCREATE_UIIMAGE(imgPath)[UIImageimageNamed:(imgPath)]#defineCREATE_UIIMAGEVIEW(imgPath)[[......
  • 数学建模竞赛中应掌握的10类算法
    数学建模竞赛中应掌握的10类算法这篇文章是搬运自2004年发表在MATHEMATICALMODELING即《数模》上的一篇文章,作者是董乘宇,曾任SHUMO.COM论坛“编程交流”版版主,获2002年全国大学生数学建模竞赛一等奖。尽管这篇文章至今已经有了整整20年的时间,但考虑到在数学建模领域或者......
  • 算法与算法分析
    目录一.前言二.算法的特性和要求三.分析算法--时间效率四.分析算法--空间效率一.前言    算法就是对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中,每个指令表示一个或多个操作。总而言之,我们数据结构就是通过算法实现操作。而我们的算法又是根......
  • 【MATLAB源码-第159期】基于matlab的胡桃夹子优化算法(NOA)机器人栅格路径规划,输出做短
    操作环境:MATLAB2022a1、算法描述胡桃夹子优化算法(NutcrackerOptimizationAlgorithm,NOA)是一个灵感来源于胡桃夹子的故事的元启发式优化算法。这个故事中,胡桃夹子是一个能够将坚果壳轻易地破开以获取内部果仁的工具。在优化算法的语境下,这个过程被比喻为寻找问题解决方案......
  • 实战篇-FPGA实现RGMII数据接收
        RGMII时序        前面讲到关于关于ARP的理论知识,该章节主要通过FPGA接收以太网数据,并作数据分析。    首先关于以太网RGMII接收时序如下图所示:                                 ......
  • 【基础算法】高精度算法
    高精度算法高精度加法模板:模板题+详解高精度减法模板:模板题+详解高精度乘法模板模板题+详解高精度除法模板模板题+详解计算机最初、也是最重要的应用就是数值运算。在编程进行数值运算时,有时会遇到运算的精度要求特别高,远远超过各种数据类型的精度范围;有时数......
  • 灭火器检测算法:防患未然,精准高效,AI智能守护加油站消防安全
    随着科技的飞速发展和安全意识的不断提升,加油站作为易燃易爆场所,其消防安全管理显得尤为重要。其中,消防灭火器的有效部署和及时维护是保障加油站安全的关键环节。近年来,AI技术在消防安全领域的应用日益广泛,特别是加油站消防灭火器检测AI算法的研发与应用,为加油站的消防安全管理提......
  • 「代码随想录算法训练营」第二十一天 | 回溯算法 part3
    93.复原IP地址题目链接:https://leetcode.cn/problems/restore-ip-addresses/题目难度:中等文章讲解:https://programmercarl.com/0093.复原IP地址.html视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/题目状态:好难,看题解通过思路:和分割回文串一样,甚至更难,在单层......
  • 【数据结构与算法】快速排序万字全攻略:hoare版本、挖坑法、前后指针法、优化版、非递
          ......