利用字符串重复出现的次数,编写一个方法,实现基本的字符串压缩功能 - daocaorendeshijie

时间:2024-03-08 17:13:38

利用字符串重复出现的次数,编写一个方法,实现基本的字符串压缩功能

/*
 * 利用字符串重复出现的次数,编写一个方法,实现基本的字符串压缩功能,比如字符串aabcccccaaa
 * 会变成a2b1c5a3,若压缩后的字符串没有变短,则返回原来的字符串
 * 
 * 思路:
 * 我们会迭代访问字符串,将字符拷贝到新字符串,并数出重复字符,在这里建立使用stringbuffer而不是用string
 * 
 * */

public class StringCount {
    String compressBetter(String str)
    {
        //检查压缩之后的长度有没有变长?
        int size=countCompression(str);
        if(size>=str.length())
        {
            return str;
        }
        StringBuffer mystr=new StringBuffer();
        char last = str.charAt(0);
        int count=1;
        for(int i=1;i<str.length();i++)
        {
            if(str.charAt(i)==last)//如果是重复字符
                count++;
            else                    //插入字符的次数和更新last字符
            {
                mystr.append(last);
                mystr.append(count);
                last=str.charAt(i);
                count=1;
            }
        }
        mystr.append(last);
        mystr.append(count);
        return mystr.toString();
    }
    /*
     * 
     * 该函数计算出压缩后字符串的长度*/
    int countCompression(String str)
    {
        if(str==null || str.isEmpty())
            return 0;
        char last=str.charAt(0);
        int size=0;
        int count=1;
        for(int i=1;i<str.length();i++)
        {
            if(str.charAt(i)==last)
                count++;
            else
            {
                last=str.charAt(i);
                size+=1+String.valueOf(count).length();
                count=1;
            }
        }
        size+=1+String.valueOf(count).length();
        return size;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StringCount obj = new StringCount();
        String str="aabcccccaaa";
        System.out.println(obj.compressBetter(str));
    }

}

2014-09-0510:31:45