程式碼隨想錄演算法訓練營,9月5日 | 151.翻轉字串裡的單詞,卡碼網:55.右旋轉字串,28. 實現 strStr(),459.重複的子字串

漪欢酒發表於2024-09-06

151.翻轉字串裡的單詞
題目連結:151.翻轉字串裡的單詞
文件講解︰程式碼隨想錄(programmercarl.com)
影片講解︰翻轉字串裡的單詞
日期:2024-09-05

想法:要求:1.不使用Java內建方法實現;思路:1.去除首尾以及中間多餘空格。2.反轉整個字串;3.反轉各個單詞(快慢指標O(n))
Java程式碼如下:

class Solution {
    public char[] removeExtraSpaces(char[] chars) {
        int slow = 0;
        for(int fast = 0; fast < chars.length; fast++){
            if(chars[fast] != ' '){//刪所有空格
                if(slow != 0) chars[slow++] = ' ';//補回空格
                while(fast < chars.length && chars[fast] != ' '){
                    chars[slow++] = chars[fast++];
                }
            }
        }
        char[] newChars = new char[slow];
        System.arraycopy(chars, 0, newChars, 0, slow); 
        return newChars;
    }

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

    public String reverseWords(String s) {
        char[] chars = s.toCharArray();
        chars = removeExtraSpaces(chars);
        reverse(chars, 0, chars.length - 1);
        int start = 0;
        for(int end = 0; end <= chars.length; end++){
            if(end == chars.length || chars[end] == ' '){
                reverse(chars, start, end - 1);
                start = end + 1;
            }
        }
        return new String(chars);
    }
}

總結:end == chars.length || chars[end] == ' '注意順序。

卡碼網:55.右旋轉字串
題目連結:卡碼網:55.右旋轉字串
文件講解︰程式碼隨想錄(programmercarl.com)
日期:2024-09-05

想法:學習上一題思路,將字串整體翻轉,檢查後發現,只需要再反轉前n個字元,和剩下的字元結果就對了。
Java程式碼如下:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        String s = in.nextLine();
        char[] chars = s.toCharArray();
        int len = s.length();
        reverse(chars, 0, len - 1);
        reverse(chars, 0, n - 1);
        reverse(chars, n, len - 1);
        System.out.println(chars);
    }
    
    public static void reverse(char[] chars, int left, int right){
        while(left < right){
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        }
    } 
}

KMP週末補。
字串總結:
1.Java的字串不能不增加空間直接操作,一般將其轉換為char[]即可與C++匹配上
2.用雙指標法實現了反轉字串,替換、刪除空格操作
3.反轉字串的思路基本是先整體再區域性
4.KMP:

雙指標:
1.陣列:移除元素。
2.連結串列:翻轉連結串列,在連結串列中求環
3.字串:反轉字串,替換空格(從後向前填充),刪除冗餘空格
4.N數之和:3,4,...,n數和(透過前後兩個指標不算向中間逼近,在一個for迴圈下完成兩個for迴圈的工作)

相關文章