繁体   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