簡體   English   中英

如何在不使用地圖的情況下在java上壓縮字符串

[英]How to compress string on java without using map

我最近開始使用 java,我想壓縮這樣的字符串:

Input:aaaaabbbbwwwccc Output:a5b4w3c3  
Input:aaabbccds       Output:a3b2c2ds  
Input:Abcd            Output:Abcd

以下代碼是我所做的,但它不起作用。

public class CompressString {

    public static void main(String[] args) {
        String out = "";
        Scanner in = new Scanner(System.in);
        String input = in.next();
        int length = input.length();
        int counter = 1;
        if (length == 0) {
            System.out.println(" ");
        } else {
            for (int i = 0; i<length;i++){
                if (input.charAt(i)==input.charAt(i+1)){
                    counter++;
                }else {
                    if (counter == 1){
                        out = out+input.charAt(i-counter);
                    }else{
                        out = out+input.charAt(i-counter)+counter;
                    }
                }
                i++;
                counter = 1;
            }
            System.out.println(out.toString());
        }
    }
}

執行此操作的最簡單程序將遍歷字符串中的每個字符並檢查該字符何時與之前看到的不同,如果是,則將最后一個及其計數添加到壓縮字符串中:

String input = "aaaaabbbbwwwccc";
StringBuilder compressed = new StringBuilder();

char last = 0;
int lastCount = 0;
for (int i = 0; i < input.length(); i++) {
  char c = input.charAt(i);
  if (last == 0 || c != last) {
    if (lastCount != 0) {
      compressed.append(last);
      if (lastCount > 1) {
        compressed.append(lastCount);
      }
    }
    last = c;
    lastCount = 1;
  } else {
    lastCount++;
  }
}

// take care of the last repeating sequence if any
if (lastCount > 0) {
  compressed.append(last);
  if (lastCount > 1) {
    compressed.append(lastCount);
  }
}

這是使用正則表達式匹配器和字符串緩沖區執行此操作的非常緊湊的方法:

String input = "aaaaabbbbwwwccc";
Pattern r = Pattern.compile("(.)\\1{0,}");
Matcher m = r.matcher(input);
StringBuffer buffer = new StringBuffer();
while (m.find()) {
    m.appendReplacement(buffer, m.group(1) + m.group(0).length());
}
m.appendTail(buffer);
System.out.println(buffer.toString());

這打印:

a5b4w3c3

作為解釋,上述邏輯搜索正則表達式模式(.)\\1{0,} 這將匹配任何單個字符,以及此后可能再次出現一次或多次的相同字符。 然后它只替換為單個字符,后跟它出現的次數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM