题解_压缩字符串

一、题目描述

利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串“aabccdd”会变成“a2b1c2d2”。若“压缩”以后的字符串没有变短,则返回原先的字符串,可以假设字符串中只包含大小写英文字母(a-z)

  • 样例输入1:“aabcccccddddd”

  • 样例输出1:“a2b1c5d5”

  • 样例输入2:“abcdd”

  • 样例输出2:“abcdd”

二、解决思路

1 检查字符串是否有必要压缩,若长度小于3,没必要压缩

2 将字符串转为字符数组,创建可变长字符串,存储压缩字符串

3 设置静动指针flag、i,计数器cnt

1  固定flag,往后遍历,若动静指针所指字符值相同,计数器加一

2  若动静指针所指字符值不相同,将计数加入压缩字符串中

3  重新固定flag,计数器归1

4  将新的静指针所指字符加入压缩字符串中

5  将静指针所指最后一个字符的计数值加入字符串中

4 检查压缩是否有效,若压缩字符串长度小于原始字符串长度,压缩有效,返回压缩字符串的toString()

三、源代码

package com.kkb.string;

import java.util.Scanner;

public class StringTask03 {
     
    public static void main(String[] args) {
     
        Scanner in = new Scanner(System.in);

        System.out.println("请输入中只包含大小写英文字母(a-z)的字符串:");
        String s = in.nextLine();

        s = compressString(s);

        System.out.println("压缩后的字符串:\n" + s);

        in.close();
    }

    public static String compressString(String s){
     
        // 检查字符串是否有必要压缩
        if (s.length() < 3) return s;

        // 获得字符串数组
        char[] cs = s.toCharArray();
        // 存储压缩字符串
        StringBuilder sb = new StringBuilder();
        sb.append(cs[0]);


        // 设置静动指针flag、i,计数器cnt
        int flag = 0;
        int cnt = 1;
        for (int i = 1; i < cs.length; i++) {
     
            // 1. 固定flag,往后遍历,若动与静相同,计数器加一
            if (cs[i] == cs[flag]){
     
                cnt++;
            }else {
     
                // 2. 若动静不同,将计数加入压缩字符串
                sb.append(cnt);
                // 3. 重新固定flag,计数器归1
                flag = i;
                cnt = 1;
                // 4. 将新固定的字符加入字符串
                sb.append(cs[flag]);
            }
        }
        // 5. 将最后一个固定的字符串的计数加入压缩字符串
        sb.append(cnt);

        // 检查压缩是否有效
        if (sb.length() < s.length()) return sb.toString();
        return s;
    }
}

四、运行结果

题解_压缩字符串_第1张图片
题解_压缩字符串_第2张图片
题解_压缩字符串_第3张图片

你可能感兴趣的:(题解_压缩字符串)