力扣-字符串压缩-java

题目描述
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
在这里插入图片描述
思路:
第一种做法-双指针
定义两个指针i和j,j指针用来计字符出现的次数。
在这里插入图片描述
先移动j指针,遇到和i相同的字符j指针就向右自增。
在这里插入图片描述
在这里插入图片描述
遇到不同字符就把j指针的值赋值给i,返回ij指针,a3。然后按照这个方法继续遍历,最后返回的结果是a3b2c3。

class Solution {
    public String compressString(String S) {

        int N = S.length();//字符串的长度
        int i = 0;//定义第一个指针表示字符
        StringBuilder str = new StringBuilder();//定义一个可变的字符串
        while (i < N) {//循环的条件是i指针小于字符串s的长度
            int j = i;//定义第二个指针j指向i
            while (j < N && S.charAt(j) == S.charAt(i)) {//如果两个指针相同移动j指针
                j++;
            }
            sb.append(S.charAt(i));//把i指针的值添加到字符串中
            sb.append(j - i);//在添加这个字符出现的次数
            i = j;//在重新的赋值
        }

        String res = str.toString();//定义字符串把可变的字符串添加进去
        if (res.length() < S.length()) {//res的长度小于s字符串的长度
            return res;//输出res
        } else {
            return S;//否则输出S
        }
    }

}

第二种做法
使用两个变量,使用一个变量用来记录当前字符,在用一个变量用来记录字符出现的次数,当遇到新的字符的时候就把这两个变量加到结果中,然后在对着两个变量重新赋值,重复这个操作,直到把所有的字符遍历完。

class Solution {
    public String compressString(String S) {
        //边界条件判断
        if (S == null || S.length() == 0)
            return S;
        StringBuilder res = new StringBuilder();//定义可变的字符串
        //先把第一个字符添加到res中
        res.append(S.charAt(0));
        int count = 1;//次数
        for (int i = 1; i < S.length(); i++) {
            //判断重复字符的数量
            if (S.charAt(i) == S.charAt(i - 1)) {
                count++;//次数++
                continue;
            }
            //走到这里,说明遇到了新的字符,先把前面字符
            //的数量添加到res中,然后再添加这个新的字符
            res.append(count).append(S.charAt(i));
            count = 1;//重置次数
        }
        //上面的计算会遗漏最后一个字符的数量,这里加上
        res.append(count);
        return res.length() >= S.length() ? S : res.toString();//res的长度小于s字符串的长度,输出res,否则输出S
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值