leetcode算法-字符串总结

系列文章目录



前言

对于字符串中的总结 一些字符串的操作 重点是KMP算法


一、 344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

class Solution {
    public void reverseString(char[] s) {
             for(int i =0 , j  = s.length -1 ; i < j ; i++ ,j--){
                 char t = s[i] ;
                 s[i] = s[j] ; 
                 s[j] = t ;
             }
             
    }
}

二、 541. 反转字符串 II

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

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

输入:s = “abcdefg”, k = 2
输出:“bacdfeg”

class Solution {
    public String reverseStr(String s, int k) {
        char[] a = s.toCharArray();
        for(int i = 0 ; i < s.length() ; i +=(2*k)){
        //由于后面要有交换操作 所以这边r-1
            int l = i ; int r = Math.min(i+k , s.length())-1;
            while(l < r){
                char t = a[l] ;
                a[l] = a[r] ;
                a[r] = t ;
                l++ ;
                r-- ;
            }
        }
        return new String(a);
    }

}

三、 剑指Offer 05.替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

class Solution {
    public String replaceSpace(String s) {
        StringBuilder res = new StringBuilder();
        for(int i = 0 ; i < s.length() ; i++){
            if(s.charAt(i) == ' '){
                res.append("%20");
            }else{
                res.append(s.charAt(i));
            }
        }
        return res.toString();
    }
}

27.移除元素

151. 反转字符串中的单词

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

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

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

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

输入:s = “the sky is blue”
输出:“blue is sky the”
进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。

思路:移除多余空格
将整个字符串反转
将每个单词反转
举个例子,源字符串为:"the sky is blue "

移除多余空格 : “the sky is blue”
字符串反转:“eulb si yks eht”
单词反转:“blue is sky the”
题解的话 这个很详细

java的话 就是不用翻转的做法

class Solution {
    public String reverseWords(String s) {
        //java中的String是不可变的 所以空间O(1)是没办法的
        String res = "";
        int n = s.length();
        for(int i = n-1 ; i >= 0 ; i--){
            if(s.charAt(i) == ' ') continue;
            int j = i ;
            while(j-1 >= 0 && s.charAt(j-1) != ' ') j--;
            //此时j-i为blue
            res += s.substring(j,i+1)+" ";
            i = j ;//更新
        }
        return res.substring(0,res.length()-1) ;

    }
}
class Solution {
    public String reverseWords(String s) {
        if(s.length() == 0||s == null)return "";
        //去掉多余空格
        String[] w = s.trim().split("\\s+");
        Collections.reverse(Arrays.asList(w));
        return String.join(" " , w );

    }
}

剑指Offer58-II.左旋转字符串

class Solution {
    public String leftRotateString(String str,int n) {
        return str.substring(n) + str.substring(0,n);
    }
}
class Solution {
    public String leftRotateString(String str, int n) {
        char[] s = str.toCharArray();
        int len = s.length;

        reverse(s, 0, len - 1);
        reverse(s, 0, len - n - 1);
        reverse(s, len - n, len - 1);

        return String.valueOf(s);
    }

    private void reverse(char[] s, int l, int r) {
        for (int i = l, j = r; i < j; i++, j--) {
            char t = s[i];
            s[i] = s[j];
            s[j] = t;
        }
    }
}

 

28. 实现 strStr()

459.重复的子字符串

这道题要先回顾KMP中ne数组的知识 回顾点这里 点这里
证明的话 看视频

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int n = s.length() ; 
        s = " " + s ;
        int[] ne = new int[n +1 ];
        for(int i = 2 , j = 0 ; i <= n ; i ++){
                while( j > 0 && s.charAt(i) != s.charAt(j+1)) j = ne[j];
                if(s.charAt(i) == s.charAt(j+1)) j++;
                ne[i] = j ;
        }
        int m = n - ne[n] ;
        return m < n  && n % m == 0 ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依嘫_吃代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值