day09leetcode: 151.翻转字符串里的单词 ;卡码网:55.右旋转字符串 ;28. 实现 strStr() ; 459.重复的子字符串

151.翻转字符串里的单词

151. 反转字符串中的单词 - 力扣(LeetCode)

这个代码有3个步骤需要去做

第一步:去除多余的空格:

这个内部的单词进行去多余空格处理,然后再调用反转的方法,

注意这个里面用while循环,才不会多自增,若是用if,会跳过完整单词的部分

class Solution {
public:
    string reverseWords(string s) {
        // 定义一个快指针,定义一个慢指针
        int fastIndex = 0, slowIndex = 0;
        while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ') {
            fastIndex++;
        }
        for (; fastIndex < s.size(); fastIndex++) {
            if (fastIndex - 1 > 0 && s[fastIndex - 1] == s[fastIndex] &&
                s[fastIndex] == ' ') {
                continue;
            } else {
                s[slowIndex++] = s[fastIndex];
            }
            if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ') {
                s.resize(slowIndex - 1);
            } else {
                s.resize(slowIndex);
            }
        }
        return s;
    }
};

第二步:反转整个字符串

 void reverse(string& s, int start, int end) { // 翻转,区间写法:左闭右闭 []
        while (start < end) {
            swap(s[start], s[end]);
            start++;
            end--;
        }
    }

第三步:反转每个单词

总体代码如下
 

class Solution {
public:
    // part 1 对全部的字符串进行整体的去除空格,只保留有效的单词间的空格
    void removeExtraSpace(string& s) {
        int fast = 0, slow = 0;
        for (
            ; fast < s.size();
            fast++) { //++
                      // 是有意为之,目的是跳过while循环后的那个空格,开始处理下一个单词。如果是多个空格,下一行代码进行处理
            if (s[fast] !=' ') { // 目的是为了不让第一个单词的前面有空格,以及后续单词前面出现多个空格的问题处理
                if (slow !=
                    0) { // 不是第一个单词,那么后续的都需要给新字符串留出单词间隔的空隔
                    s[slow++] =' ';
                }
                while (fast < s.size() && s[fast] !=' ') { // 进行整个单词的处理
                    s[slow] = s[fast];
                    fast++; // while 循环的自增:while
                            // 循环在遇到非空格字符时,将所有连续的非空格字符复制到
                            // slow 指针位置,并将 fast 指针移动到下一个空格位置
                    slow++;
                }
            }
        }
        s.resize(slow);
    }

    void reverseString(string& s, int start, int end) {
        while (start < end) {
            swap(s[start], s[end]);
            start++;
            end--;
        }
    }
    string reverseWords(string s) {
        removeExtraSpace(s);
        reverseString(s, 0, s.size() - 1);
        int start = 0;
        for (int i = 0; i <= s.size(); i++) {
            if (i == s.size() ||
                    s[i] ==' ') { // 说明到了整个字符串的末尾或者是到了某个单词的末尾,可以进行整体的反转了
                reverseString(s, start, i - 1);
                start = i + 1;
            }
        }
        return s;
    }
};

java代码如下:

class Solution {
    public String reverseWords(String s) {
        // 调用一个函数,该函数可以做到把整个s进行去空格处理, 考虑用StringBuilder ,变成可变化的序列字符串 对象sb
        StringBuilder sb = removeExtraSpace(s);
        // 使用 setCharAt 和temp的方式,把整个sb字符从start到end进行全部的倒换
        reverseString(sb,0,sb.length()-1);
        // 置换后从头到尾,然后找到空格处,进行每个单词的反转
        reverseEachWord(sb);


        return sb.toString();

    }

    public StringBuilder removeExtraSpace(String s){
        //进行去除空格
        int start =0;
        int end = s.length()-1;
        while(s.charAt(start) ==' ') start++;//这里用while,不是if
        while(s.charAt(end)==' ') end--;
        StringBuilder sb =new StringBuilder();
        while(start<=end){
            char c =s.charAt(start);
            if(c !=' '|| sb.charAt(sb.length()-1) !=' '){
                sb.append(c);
            }
            start++;
        }
        return sb;

    }

    public void reverseString(StringBuilder s ,int start ,int end ){
        //exchange
        while (start<=end){
            char temp = s.charAt(start);
            s.setCharAt(start,s.charAt(end));
            s.setCharAt(end,temp);
            start++;
            end --;
        }  
    }
    public void reverseEachWord (StringBuilder sb){
        int start =0;
        int  end = 1;
        int n=sb.length();
        while(start<n){

            while(end <n && sb.charAt(end) !=' '){//这个目的是为了找到下一个不为空格的单词
                end ++;
            }
            reverseString(sb,start,end-1);
            start= end+1;
            end = start+1;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值