leetcode【每日一题】字符串压缩Java

题干

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

示例1:

 输入:"aabcccccaaa"
 输出:"a2b1c5a3"

示例2:

 输入:"abbccd"
 输出:"abbccd"
 解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。

提示:

字符串长度在[0, 50000]范围内。

想法

我两个想法
一个是用hashmap存储次数,一旦遇到不同的字符串那就清空hashmap以免之前的干扰到后边的;
遇到不同的就读hashmap把之前连续的取出来
最后比较长度

另一个用数组加一个count就行

Java代码

package daily;

import java.util.HashMap;

public class CompressString {
    public String compressString(String S) {
        StringBuffer stringBuffer =new StringBuffer();
        int len=S.length();
        //空判断
        if(len==0||S.isEmpty()){
            return S;
        }
        //字符和对应出现次数
        HashMap<Character,Integer> hashMap= new HashMap<>();
        char [] arr= S.toCharArray();
        //首位单独处理
        hashMap.put(arr[0],1);
        for (int i=1;i<arr.length;i++){
            if(hashMap.containsKey(arr[i])){
                //连续情况
                hashMap.put(arr[i],hashMap.get(arr[i])+1);
            }
            else {
                //非连续情况就先把之前连续的放进stringbuffer
                stringBuffer.append(arr[i-1]);
                stringBuffer.append(hashMap.get(arr[i-1]));
                hashMap.clear();
                hashMap.put(arr[i],1);
            }
        }
        //首位手动处理
        if(hashMap.containsKey(arr[len-1])){
            stringBuffer.append(arr[len-1]);
            stringBuffer.append(hashMap.get(arr[len-1]));
        }
        else {
            stringBuffer.append(arr[len-1]);
            stringBuffer.append(1);
        }

        int tem=stringBuffer.length();
        if(tem<len){
            return  stringBuffer.toString();
        }


return  S;
    }

    public  static  void main(String[] args){
        CompressString compressString=new CompressString();
        String S="bbbac";
        System.out.println(compressString.compressString(S));
    }
}

leetcode上更快更易懂的代码

也就是我的思路二的实现

class Solution {
    public String compressString(String s) {
        int len = s.length();
        if (len <= 1){
            return s;
        }

        StringBuilder sb = new StringBuilder();
        char[] chars = s.toCharArray();
        char chOld = chars[0],chNew=chOld;
        int count = 1;
        for (int i=1;i<= len-1 ;){
            chNew = chars[i];
            if (chOld != chNew){
                sb.append(chOld);
                sb.append(count);
                chOld = chNew;
                count = 1;
                i++;
                continue;
            }
            count++;
            i++;


        }
        sb.append(chNew).append(count);

        if (len <= sb.length()){
            return s;
        }
        return sb.toString();
    }
}

我的leetcode解答已经上传到我的git

发布了180 篇原创文章 · 获赞 0 · 访问量 3791

猜你喜欢

转载自blog.csdn.net/qq_43491066/article/details/104893250