代码随想录 day 9 字符串

第四章 字符串part02

今日任务
● 151.翻转字符串里的单词
● 卡码网:55.右旋转字符串
● 28. 实现 strStr()
● 459.重复的子字符串
● 字符串总结
● 双指针回顾

详细布置
151.翻转字符串里的单词

建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html

卡码网:55.右旋转字符串

建议:题解中的解法如果没接触过的话,应该会想不到
题目链接/文章讲解:
https://programmercarl.com/kama55.%E5%8F%B3%E6%97%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.html

28. 实现 strStr()

因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会 好懂很多。
或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。
因为大家 算法能力还没到,细扣 很难的算法,会把自己绕进去,就算别人给解释,只会激发出更多的问题和疑惑。所以大家先了解大体过程,知道这么回事, 等自己有 算法基础和思维了,在看多看几遍视频,慢慢就理解了。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0028.%E5%AE%9E%E7%8E%B0strStr.html

459.重复的子字符串

本题算是KMP算法的一个应用,不过 对KMP了解不够熟练的话,理解本题就难很多。
我的建议是 KMP和本题,一刷的时候 ,可以适当放过,了解怎么回事就行,二刷的时候再来硬啃
题目链接/文章讲解/视频讲解:https://programmercarl.com/0459.%E9%87%8D%E5%A4%8D%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.html

字符串总结

比较简单,大家读一遍就行
题目链接/文章讲解:https://programmercarl.com/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%80%BB%E7%BB%93.html

双指针回顾

此时我们已经做过10道双指针的题目了,来一起回顾一下,大家自己也总结一下双指针的心得
文章讲解:https://programmercarl.com/%E5%8F%8C%E6%8C%87%E9%92%88%E6%80%BB%E7%BB%93.html

151.翻转字符串里的单词

题目链接

https://leetcode.cn/problems/reverse-words-in-a-string/

解题思路

使用split函数就是一道水题了
1.移除多余空格
2.将整个字符串反转
3.将每个单词反转
举个例子,源字符串为:"the sky is blue "
移除多余空格 : “the sky is blue”
字符串反转:“eulb si yks eht”
单词反转:“blue is sky the”

code

    //1.移除多余空格
    //2.反转字符串
    //3.反转每个单词
    public String reverseWords(String s) {
        StringBuilder sb =removeElement(s);
        reverseStr(sb,0,sb.length()-1);
        reverseEachWord(sb);
        return sb.toString();
    }

    public StringBuilder removeElement(String s){
        int start=0;
        int end=s.length()-1;
        while(s.charAt(start)==' ') start++;
        while (s.charAt(end) == ' ') end--;
        StringBuilder sb=new StringBuilder();
        while(start<=end){//start<=end 是因为要处理最后一个字符串
            if(s.charAt(start)!=' '|| sb.charAt(sb.length()-1)!=' '){
                sb.append(s.charAt(start));
            }
            start++;
        }
        return sb;
    }

    public void reverseStr(StringBuilder sb,int start,int end){
        while(start<end){//start<end 是因为剩余一个字符串不需要交换了
            char temp=sb.charAt(start);
            sb.setCharAt(start,sb.charAt(end));
            sb.setCharAt(end,temp);
            start++;
            end--;
        }
    }

    public void reverseEachWord(StringBuilder sb){
        int slow=0;
        for(int i=0;i<sb.length();i++){
            if(sb.charAt(i)==' '){
                reverseStr(sb,slow,i-1);
                slow=i+1;
            }else if(i==sb.length()-1){
                reverseStr(sb,slow,i);
            }
        }
    }

卡码网:55.右旋转字符串

题目链接

https://kamacoder.com/problempage.php?pid=1065

解题思路

整体翻转
部分翻转

code

    public static char[] rightRotate(int k,String str) {
        char[] chars = str.toCharArray();
        reverseStr(chars, 0, chars.length - 1);
        reverseStr(chars, 0, k-1);
        reverseStr(chars, k, chars.length - 1);
        return chars;
    }

    public static void reverseStr(char[] str, int start, int end) {
        while (start < end) {
            char temp = str[start];
            str[start] = str[end];
            str[end] = temp;
            start++;
            end--;
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = Integer.parseInt(sc.nextLine());
        String str = sc.nextLine();
        System.out.println(rightRotate(k,str));
    }

28. 实现 strStr()

题目链接

解题思路

code

28. 459.重复的子字符串

题目链接

解题思路

code

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值