编写程序压缩字符串

时间:2015-11-03 05:37:29

标签: java string algorithm

问题: 行程编码(RLE)是一种简单的“压缩算法”(一种算法,它采用一块数据并减小其大小,产生一个在较小空间内包含相同信息的块)。它通过用表示整个序列的短“标记”替换相同数据项的重复序列来工作。将RLE应用于字符串涉及在字符串中查找重复相同字符的序列。每个这样的序列应该被一个由以下内容组成的“令牌”替换:

the number of characters in the sequence
the repeating character

如果一个角色不重复,则应该单独留下。

例如,请考虑以下字符串:

qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT

应用RLE算法后,此字符串将转换为:

q9w5e2rt5y4qw2Er3T

这是我到目前为止所做的,我不知道如何计算角色重复次数的次数。有人可以帮忙!!!!

public class Compress1 {
    public static void main(String[] args){
        System.out.println("Enter a string");
        String input = IO.readString();
        char[] inputChar = input.toCharArray();
        for (int index = 0; index < inputChar.length; index++){
            char current = inputChar[index];

            if (current == (current + 1)){
                int count = 
            }
        }
    }
}

4 个答案:

答案 0 :(得分:2)

而不是调试代码,这里有一些工作代码:

String input = "qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT";

String previous = input.substring(0, 1);
int count = 1;
for (String c : input.substring(1).split("")) {
    if (previous.equals(c)) {
        count++;
    } else {
        System.out.print((count == 1 ? "" : count) + previous);
        previous = c;
        count = 1;
    }
}
System.out.println((count == 1 ? "" : count) + previous);

<强>输出:

q9w5e2rt5y4qw2Er3T

将它与你自己的比较,并按照其逻辑找出你出错的地方。

答案 1 :(得分:1)

你可以试试这个:

String str = "qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT";
char[] arr = str.toCharArray();
int count = 1;
StringBuilder sb = new StringBuilder();
char prev = arr[0];

for (int i = 1; i < arr.length; i++) {
    char curr = arr[i];
    prev = arr[i - 1];
    if (curr == prev) {
        count++;
    } else {
        if (count < 2) {
            sb.append(prev);
        } else {
            sb.append(count).append(prev);
            count = 1;
        }
    }
}

if (count < 2) {
    sb.append(prev);
} else {
    sb.append(count).append(prev);
}

System.out.println("Compressed : " + sb.toString());

输出:Compressed : q9w5e2rt5y4qw2Er3T

答案 2 :(得分:0)

这是您的代码的工作版本。它逐个字符地沿着输入字符串。如果下一个字符不同而不是前一个字符,那么它会输出字符的RLE版本(例如,如果字符仅出现一次,则为字符,或者如果字符出现超过字符,则为字符后跟字符一旦)。如果下一个字符与前一个字符是相同,则它会递增一个计数器以跟踪出现次数。

如果仔细观察,您会注意到我在输入字符串的末尾附加了一个新行(\n)。这允许我的算法“知道”它已经到达输入字符串的末尾。如果您计划为RLE处理输入多个字符串,它也会很好地打印换行符。

在某些时候,您可能想要提取一个执行RLE处理的方法。目前,我已将代码保留在main()方法中。

public class Compress1 {
    public static void main(String[] args){
        System.out.println("Enter a string");
        String input = IO.readString();

        // check for null or empty input
        if (input == null || input.length() == 0) {
            System.out.println("null or empty string input");
            System.exit(0);
        }

        // handle single character input
        if (input.length() == 1) {
            System.out.println(String.valueOf(curr));
            System.exit(0);
        }

        // add a newline character to the end of the input string
        // so the algorithm can detect a "change" at the end
        input += "\n";

        char curr = input.charAt(0);
        int count=1;

        for (int i=1; i < input.length(); ++i) {
            char next = input.charAt(i);
            if (curr != next) {
                if (count > 1) {
                    System.out.print(count + String.valueOf(curr));
                }
                else {
                    System.out.print(curr);
                }
                count = 1;
            }
            else {
                ++count;
            }

            curr = next;
        }
    }
}

以下是我使用IntelliJ测试的示例输入和输出:

<强>输入:

qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT

<强>输出:

q9w5e2rt5y4qw2Er3T

答案 3 :(得分:0)

public static void main (String[] args) {
    System.out.println("Enter a string");
    String input = IO.readString();
    final char[] charArray = input.toCharArray();
    final StringBuilder stringBuilder = new StringBuilder();
    int index = 1;
    for (int current = 1, previous = 0; current <= charArray.length; current++, previous++) {
        if (current == charArray.length || charArray[previous] != charArray[current]) {
            if (index > 1) {
                stringBuilder.append(index);
            }
            stringBuilder.append(charArray[previous]);
            index = 1;
        } else {
            index++;
        }
    }
    System.out.println(stringBuilder.toString());
}