算法训练Day8|字符串

60 阅读1分钟

344 反转字符串

s[i] 与 s[n-1-i]交换

public void reverseString(char[] s) {
    int n = s.length;
    for (int left = 0, right = n - 1; left < right; ++left, --right) {
        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
    }
}

541 反转字符串2

反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。 Math.min(i+k,n)

public String reverseStr(String s, int k) {
    int n = s.length();
    char[] arr = s.toCharArray();
    for (int i = 0; i < n; i += 2 * k) {
        reverse(arr, i, Math.min(i + k, n) - 1);
    }

    return new String(arr);
}

public void reverse(char[] arr, int left, int right) {
    while (left < right) {
        char temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
        left++;
        right--;
    }
}

替换空格 先声明三倍大小的字符数组, 遍历原数组,按规则替换到新数组

public String replaceSpace(String s) {
    int length = s.length();
    char[] array = new char[length * 3];

    int size = 0;
    for (int i = 0; i < length; i++) {
        char c = s.charAt(i);
        if (c == ' ') {
            array[size++] = '%';
            array[size++] = '2';
            array[size++] = '0';
        } else {
            array[size++] = c;
        }
    }
    String newStr = new String(array, 0 , size);
    return newStr;
}

stringbuilder

public String replaceSpace(String s) {
    if (s == null) {
        return null;
    }
    //选用 StringBuilder 单线程使用,比较快,选不选都行
    StringBuilder sb = new StringBuilder();
    //使用 sb 逐个复制 str ,碰到空格则替换,否则直接复制
    for (int i = 0; i < s.length(); i++) {
        //str.charAt(i) 为 char 类型,为了比较需要将其转为和 " " 相同的字符串类型
        //if (" ".equals(String.valueOf(str.charAt(i)))){
        if (s.charAt(i) == ' ') {
            sb.append("%20");
        } else {
            sb.append(s.charAt(i));
        }
    }
    return sb.toString();
}

151 反转字符串中的单词

利用java语言特性

public String reverseWords(String s) {
    //除去开头和末尾的空白字符
    s = s.trim();

    //正则匹配连续的空白字符作为分隔符分割
    List<String> wordList = Arrays.asList(s.split("\s+"));
    Collections.reverse(wordList);
    return String.join(" ", wordList);
}

左旋转字符串

substring 时间复杂度o1,空间复杂度on

public String reverseLeftWords(String s, int n) {
    String left = s.substring(0, n);
    String right = s.substring(n, s.length());
    String result = right + left;

    return result;
}

三次reverse

image.png

public String reverseLeftWords(String s, int n) {
    int len = s.length();
    StringBuilder sb = new StringBuilder(s);
    reverseString(sb,0, n - 1);
    reverseString(sb, n, len - 1);

    return sb.reverse().toString();
}

public void reverseString(StringBuilder sb, int start, int end) {
    while (start < end) {
        char temp = sb.charAt(start);
        sb.setCharAt(start, sb.charAt(end));
        sb.setCharAt(end, temp);
        start++;
        end--;
    }
}