leetcode(String)--443. 压缩字符串

leetcode(String)–443. 压缩字符串

1,题目:

在这里插入图片描述
2,思路:

方法一:滑动窗口:

利用滑动窗口法,左右指针起点都为原数组的首位。
实现步骤如下:

  • 1.不断右移右指针,使窗口不断增大;
  • 2.当窗口内出现一个不同的元素时,就可以将元素及其数量(等于左右指针之差)更新在数组中,然后让左指针指向右指针;
  • 3.遍历到最后一个字符时也需要结算,因此将右指针的终点设为数组之外一格。当右指针移到终点时也要更新数组。

方法二:双指针:

  • 遍历字符串

  • 取相同字符序列的首字符存下

  • 记录相同字符序列首元素位置

  • i指针滑动到相同字符序列末尾的下一个位置

  • i若相同字符序列长度大于1

  • 向结果中加入相同字符序列的长度的字符形式

  • t即为已压缩的结果的长度

看题解中还有栈的方法来解。这里没有写,等以后看懂了在写。

3,代码:

方法一:滑动窗口:

//滑动窗口:
/*
利用滑动窗口法,左右指针起点都为原数组的首位。
实现步骤如下:

1.不断右移右指针,使窗口不断增大;
2.当窗口内出现一个不同的元素时,就可以将元素及其数量(等于左右指针之差)更新在数组中,然后让左指针指向右指针;
3.遍历到最后一个字符时也需要结算,因此将右指针的终点设为数组之外一格。当右指针移到终点时也要更新数组。

*/
class Solution {
    public int compress(char[] chars) {     // 数组大小范围: 1 <= chars.length <= 1000
        int left = 0;
        int size = 0;
        
        // 由于最后一个字符也需要判断,所以将右指针终点放到数组之外一格
        for (int right = 0; right <= chars.length; right++) {
            // 当遍历完成,或右指针元素不等于左指针元素时,更新数组
            if (right == chars.length || chars[right] != chars[left]) {
                chars[size++] = chars[left];    // 更新字符
                if (right - left > 1) {         // 更新计数,当个数大于 1 时才更新
                    for(char c : String.valueOf(right - left).toCharArray()) {
                        chars[size++] = c;//向结果中加入相同字符序列的长度的字符形式
                    }
                }
                left = right;//然后让左指针指向右指针
            }
        }
        
        return size;
    }
}

方法二:双指针:

class Solution {
   public int compress(char[] chars) {
        int t=0;//设置指针
        int i=0;
        while (i <chars.length && t<chars.length) {//遍历字符串
            chars[t++]=chars[i];//取相同字符序列的首字符存下
            int temp=i;//记录相同字符序列首元素位置
            while (i<chars.length &&chars[i]==chars[t-1])
                i++;//i指针滑动到相同字符序列末尾的下一个位置
            if(i-temp>1){//若相同字符序列长度大于1
                for(char c:String.valueOf(i-temp).toCharArray()){//向结果中加入相同字符序列的长度的字符形式
                    chars[t++]=c;
                }
            }
        }
        return t;//t即为已压缩的结果的长度
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值