【数据结构】字符串 | 反转字符串

88 阅读2分钟

题目一344. 反转字符串 - 力扣(LeetCode)

image.png

思路:

要求原地修改数组,不能新建一个数组来遍历
方法:利用left 和 right 双指针遍历

  • 通过数值交换,定义tmp
int tmp = s[i];
s[i] = s[j];
s[j] = tmp;
  • 通过位运算交换,不用额外空间
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];

代码

  • 这里的字符串s是char[]格式
  • 没有返回值
class Solution {
    public void reverseString(char[] s) {
        int left = 0;
        int right = s.length -1;
        while(left < right) {
            s[left] ^= s[right];
            s[right] ^= s[left];
            s[left] ^= s[right];
            left++;
            right--;
        }
    }
}

题目二541. 反转字符串 II - 力扣(LeetCode)

image.png

思路

指针i步长为2k,判断i+k <= length -1是否满足

  • 若满足reverse(chs,i,i+k-1);
  • 若不满足reverse(chs,i,chs.length - 1);

代码

  • 字符串-->字符数组:char[] chs = s.toCharArray();
  • 字符数组-->字符串:new String(chs)
class Solution {
    public String reverseStr(String s, int k) {
        int i = 0;
        char[] chs = s.toCharArray();
        while(i < chs.length) {
            if((i+k) < chs.length){
                reverse(chs,i,i+k-1);
            }else{
                reverse(chs,i,chs.length - 1);
            }
            i += 2*k;
        }
        return new String(chs);
    }

    public void reverse(char[] s,int a,int b) {
        int i = a;
        int j = b;
        while(i < j) {
            s[i] ^= s[j];
            s[j] ^= s[i];
            s[i] ^= s[j];
            i++;
            j--;
        }
    }
}

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

image.png

思路

1、 先用一个函数removeBlank()来移除字符串的多余空格,只保留每个单词最前面的空格(首字母除外)
2、 用reverse(chs,start,end)来反转字符数组的某一部分
3、 首先反转整个字符串
4、 反转每个单词,遍历到不是空格的时候,循环i++,记录单词结尾位置

代码

class Solution {
    public String reverseWords(String s) {
        // System.out.println(removeBlank(s));
        char[] chs = removeBlank(s).toCharArray();
        reverse(chs,0,chs.length-1);
        // System.out.println(new String(chs));

        for(int i = 0;i<chs.length;i++) {
            if(chs[i] != ' ') {
                int start = i;
                while(i < chs.length && chs[i] != ' ') {
                    i++;
                }
                reverse(chs,start,i-1);
            }
        }
        return new String(chs);
    }
    public void reverse(char[] ch, int start, int end) {
        // 反转部分字符
        int i = start;
        int j = end;
        while(i < j) {
            char tmp;
            tmp = ch[i];
            ch[i] = ch[j];
            ch[j] = tmp;
            i++;
            j--;
        }
    }
    public String removeBlank(String s) {
        char[] chs = s.toCharArray();
        // char[] newchs;
        int j = 0;
        for(int i = 0;i < chs.length;i++) {
            if(chs[i] != ' ') {
                if(j != 0) {
                    chs[j] = ' ';
                    j++;
                }
                while(i < chs.length && chs[i] != ' ') {
                    chs[j] = chs[i];
                    i++;
                    j++;
                }
            }
        }
        return new String(chs,0,j);
    }
}

学习时间:20min