。String []型C016_フェイス質問01.06圧縮された文字列(スタックエラー|ダブルポインタ)

一つ、タイトル説明

Implement a method to perform basic string compression using the counts of repeated characters. 
For example, the string aabcccccaaa would become a2blc5a3. 
If the "compressed" string would not become smaller than the original string, 
your method should return the original string. 
You can assume the string has only uppercase and lowercase letters (a - z).

第二に、問題解決

方法の一つ:スタック

*興味深いエラー:文字10が直接することはできません(char) (10 + '0')
10個の文字に変換されます。

public String compressString(String S) {
    int N = S.length();
    if (N <= 2) return S;

    Stack<Character> stack = new Stack<>();
    char[] s = S.toCharArray();
    stack.push(s[0]);
    int cnt = 1;
    for (int i = 1; i < N; i++) {
        if (s[i] != stack.peek()) {
            if (cnt > 0 && cnt < 10) {
                stack.push((char) (cnt + '0'));
                cnt = 1;
            } else {
                stack
            }
            stack.push(s[i]);
        } else {
            cnt++;
        }
    }  
    if (cnt > 0)
        stack.push((char) (cnt + '0'));
    
    StringBuilder sb = new StringBuilder();
    while (!stack.isEmpty()) {
        sb.append(stack.pop());
    }
    if (sb.length() >= N) 
        return S;
    return sb.reverse().toString();
}

複雑性分析

  • 時間計算: ザ・ n個 O(N)
  • 宇宙の複雑さ: ザ・ n個 O(N)

方法2:ダブルポインタ

アルゴリズム

  • L、Rは、場合ウィンドウを維持します S [ l ] = s [ l ] S [L] = S [L] 、ウィンドウの右側の境界線は1増加されます。
  • 経験 s [ l ] ! = s [ r ] S [L]!= S [R] 状態、文字スプライシングCNTの数、RLのCNT実際値で始まります。
public String compressString(String S) {
    int N = S.length();
    if (N <= 2) return S;
    char[] s = S.toCharArray();

    StringBuilder sb = new StringBuilder();
    int l = 0,  r = l;
    int cnt = 0;

    while (l < N) {
        while (r < N && s[l] == s[r]) {
            r++;
        }       
        sb.append(s[l]);
        sb.append(r-l);
        l = r; 
    }
    if (sb.length() >= N) 
        return S;
    return sb.toString();
}

複雑性分析

  • 時間計算: O ( n ) O(N)
  • 宇宙の複雑さ: O ( n ) O(N)
公開された495元の記事 ウォンの賞賛105 ・は 30000 +を見て

おすすめ

転載: blog.csdn.net/qq_43539599/article/details/104895236