首页 > 试题广场 >

基本字符串压缩

[编程题]基本字符串压缩
  • 热度指数:73175 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

现给定一个string iniString字符串(长度小于等于10000),请按连续重复字母压缩的方式将该字符串压缩,返回结果为string,比如,字符串“aabbcccccaaa”经压缩会变成“a2b2c5a3”,若压缩后的字符串没有变短,则返回原先的字符串。注意保证串内字符均由大小写英文字母组成。

示例1

输入

"aabcccccaaa"

输出

"a2b1c5a3"
示例2

输入

"welcometonowcoderrrrr"

输出

"welcometonowcoderrrrr"

说明

welcometonowcoderrrrr转换成重复字母压缩的结果是w1e1l1c1o1m1e1t1o1n1o1w1c1o1d1e1r5,比原字符串的长度还要长,所以返回原先的字符串。 
推荐
Ron头像 Ron
import java.util.*;

public class Zipper {
	public String zipString(String iniString) {
		// write code here
		if(iniString==null||iniString.trim().length()==0){
			return "";
		}
		StringBuilder strB = new StringBuilder("");
		char[] iniStr = iniString.toCharArray();
		char pre;
		pre = iniStr[0];
		int count = 1;
		for(int i = 1;i < iniStr.length; i++){
			if(pre == iniStr[i]){
				count++;
			}else{
				strB.append(pre+""+count);
				pre = iniStr[i];
				count = 1;
			}
		}
		strB.append(pre+""+count);
		if(strB.toString().length() >= iniString.length()){
			return iniString;
		}
		return strB.toString();
	}
}

编辑于 2015-10-14 14:31:45 回复(18)
两个数组
ch 存储字符
in 存储对应下标
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {
        // write code here
        int len = iniString.length();

        if(len == 0){
            return iniString;
        }

        List<Character> ch  = new ArrayList<>();
        List<Integer> in = new ArrayList<>();

        int index = 0;
        ch.add(index,iniString.charAt(index));
        in.add(index,1);
        index++;

        for(int i = 1;i < iniString.length();i++){
            char c = iniString.charAt(i);
            if(ch.get(index - 1) == c){
                in.set(index - 1,in.get(index - 1) + 1);
            }else{
                ch.add(index,c);
                in.add(index,1);
                index++;
            }
        }

        StringBuilder sb = new StringBuilder();
        for(int i  = 0; i < index ;i++){
            sb.append(ch.get(i));
            sb.append(in.get(i));
        }
      
        return sb.toString().length() > iniString.length() ? iniString : sb.toString();
        
    }
}


发表于 2024-07-30 11:38:07 回复(0)
import java.util.*;
public class Zipper {
    public String zipString(String iniString) {
        StringBuffer str = new StringBuffer();
        int count = 0;
        for(int i = 0;i < iniString.length();i++){
            char s = iniString.charAt(i);
            if(i == iniString.length() - 2){
                char sn = iniString.charAt(i+1);
                if(s == sn){
                    ++count;
                    str.append(s).append(++count);
                }else{
                    str.append(s).append(++count);
                    count=0;
                    str.append(sn).append(++count);
                }
                break;
            }
            if(s == iniString.charAt(i+1)){
                count++;
            }else{
                str.append(s).append(++count);
                count = 0;
            }
        }
        if(str.length() < iniString.length()){
            return str.toString();
        }
        return iniString;
    }

}
求大神帮忙看看有没有可以优化的
发表于 2022-02-24 22:36:36 回复(0)
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {
      
        if (iniString == null) throw new IllegalArgumentException("传入为空!");
        char[] chars = iniString.toCharArray();
        StringBuilder newStr = new StringBuilder(""); // 默认为空
        int num = 0;

        for (int i = 0; i < chars.length - 1; ) {

            // 前后的不相等
            if (chars[i] != chars[i + 1]) {
                newStr.append(chars[i]);
                newStr.append("1");
                i++;
            }

                // 前后的相等 再看看有几个相等的 ---> 记录到 num 中
            else {
                num = 1;
                for (int j = i; j < chars.length - 1; j++) { // 从这个遍历 , 相同的的记录个数
                    if (chars[i] == chars[j + 1]) num++;
                    else break;
                }

                newStr.append(chars[i]);
                newStr.append(num);

                i += num;
                num = 0;
            }
        }

        return String.valueOf(newStr).length() < iniString.length() ?  String.valueOf(newStr):iniString;
    }
}
发表于 2022-02-15 22:34:46 回复(0)
正则表达式
import java.util.*;
import java.util.regex.*;

public class Zipper {
    public String zipString(String iniString) {
        // write code here
        Pattern p = Pattern.compile("(.)\\1*");
        Matcher m = p.matcher(iniString);
        StringBuilder ret = new StringBuilder(iniString.length()*2);
        while (m.find()) {
            String t = m.group(0);
            ret.append(t.charAt(0));
            ret.append(t.length());
        }
        System.out.println(ret);
        return iniString.length() <= ret.length() ? iniString : ret.toString();
    }
}


发表于 2022-01-21 19:28:00 回复(0)
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {
        // write code here
        if(iniString == null || iniString.length()==0) return iniString;
        StringBuilder builder = new StringBuilder("");
        builder.append(iniString.charAt(0));
        int count=1;
        for(int i=1;i<iniString.length();i++){
            if(iniString.charAt(i)==iniString.charAt(i-1)) count++;
            else{
                builder.append(count).append(iniString.charAt(i));
                count=1;
            }
        }
        builder.append(count);
        if(builder.toString().length()>=2*iniString.length()) return iniString;
        return builder.toString();
    }
}

发表于 2022-01-17 00:28:21 回复(0)
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {

        String a = iniString;
        StringBuffer result = new StringBuffer();
        int count = 1;
        for (int i = 0; i < a.length() - 1; i++) {

            if (a.charAt(i) == a.charAt(i + 1)) {
                count++;
                continue;
            }
            result.append(a.charAt(i)).append(count);
            count = 1;
        }
        result.append(a.charAt(a.length() - 1)).append(count);
        String bbb = result + "";
        if(bbb.length() >= a.length()){
            return a;
        }else{
            return bbb;
        }   
    }
}
发表于 2021-02-20 10:32:45 回复(0)
import java.util.*;

public class Zipper {
    public String zipString(String s) {
        if(s==null||s.trim().isEmpty()) return "";
        // write code here
        StringBuilder sb =new StringBuilder();
        char[]p = s.toCharArray();
        char pre = p[0];
        int count = 1;
        for(int i=1;i<p.length;++i) {
            char cur = p[i];
            if(pre==cur) {
                ++count;
            }else{
                sb.append(pre).append(count);
                pre = cur;
                count  = 1;
            }
        }
        sb.append(pre).append(count);
        String calc = sb.toString();
        if(calc.length()>=p.length) return s;
        return  calc;
    }
    
     
}

发表于 2020-10-29 13:22:46 回复(0)
遍历统计拼接🤣🤣🤣
import java.util.*;
public class Zipper {
    public String zipString(String iniString) {
        int count = 1;
        String resultString = "";
        for (int i = 0; i < iniString.length()-1; i++) {
            if (iniString.charAt(i) == iniString.charAt(i+1)) {
                count++;
                // 不越界前提下统计最后一组字符
                if (i == iniString.length()-2) resultString += iniString.charAt(i) + String.valueOf(count);
            } else {
                resultString += iniString.charAt(i) + String.valueOf(count);
                // 重置count
                count = 1;
            }
        }
        if (resultString.length() > iniString.length()) return iniString;
        else return resultString;
    }
}


发表于 2020-08-23 14:24:35 回复(0)
// 解法一
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {
        StringBuilder sb = new StringBuilder();
        int cnt = 1;
        char last = iniString.charAt(0);
        for (int i = 1; i < iniString.length(); i++) {
            if (iniString.charAt(i) == last) {
                cnt++;
            } else {
                sb.append(last);
                sb.append(cnt);
                cnt = 1;
                last = iniString.charAt(i);
            }
        }
        sb.append(last);
        sb.append(cnt);

        return sb.length() >= iniString.length() ? iniString : sb.toString();
    }
}

// 解法二
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {
        int size = changeSize(iniString);
        if (size >= iniString.length()) {
            return iniString;
        }

        char[] res = new char[size];
        int index = 0;
        int cnt = 1;
        char last = iniString.charAt(0);
        for (int i = 1; i < iniString.length(); i++) {
            if (iniString.charAt(i) == last) {
                cnt++;
            } else {
                index = setChar(res, last, index, cnt);
                cnt = 1;
                last = iniString.charAt(i);
            }
        }
        setChar(res, last, index, cnt);

        return new String(res);
    }

    public int setChar(char[] res, char ch, int index, int cnt) {
        res[index++] = ch;
        char[] num = String.valueOf(cnt).toCharArray();
        for (char n : num) {
            res[index++] = n;
        }

        return index;
    }

    public int changeSize(String iniString) {
        int cnt = 1;
        int size = 0;
        char last = iniString.charAt(0);
        for (int i = 1; i < iniString.length(); i++) {
            if (iniString.charAt(i) == last) {
                cnt++;
            } else {
                size += 1 + String.valueOf(cnt).length();
                cnt = 1;
                last = iniString.charAt(i);
            }
        }
        size += 1 + String.valueOf(cnt).length();

        return size;
    }
}

发表于 2020-07-12 15:26:40 回复(0)
import java.util.*;
/**
标签
*/
/*//这种只适合前面出现后面不出现的字符串
public class Zipper {
    public String zipString(String iniString) {
        // write code here
        if(iniString.length()<=2)return iniString;
        StringBuffer sb = new StringBuffer();
        int sIndex = 0;
        int n = iniString.length();
        while(sIndex < n){
            char ch = iniString.charAt(sIndex);
            int eIndex = iniString.lastIndexOf(ch);
            if(sIndex==eIndex){
                sb.append(ch);
                sIndex++;
            }else{
                sb.append(ch);
                sb.append(eIndex-sIndex + 1);
                sIndex = eIndex+1;
            }
        }
        if(n<=sb.length())
            return iniString;
        else
            return sb.toString();
    }
}*/

public class Zipper {
    public String zipString(String iniString) {
        // write code here
        if(iniString.length()<=2)return iniString;
        StringBuffer sb = new StringBuffer();
        int sIndex = 0;
        int n = iniString.length();
        while(sIndex < n){
            char ch = iniString.charAt(sIndex);
            int temp = 0;
            while(sIndex < n && ch==iniString.charAt(sIndex)){
                temp++;
                sIndex++;
            }
            sb.append(ch);
            sb.append(temp);
        }
        if(n<=sb.length())
            return iniString;
        else
            return sb.toString();
    }
}

编辑于 2020-06-12 19:22:38 回复(0)
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {
        // write code here
        char[] chars = iniString.toCharArray();
        int size = iniString.length();
        char[] temp = new char[10000];
        int k = 0;
        int i = 0;
        int leng=0;
        while(i<size) {
            int isize = 1;
            for(int j=i+1; j< size; j++) {
                if(chars[i] == chars[j]) {
                    isize++;              
                }else {
                    temp[k++] = chars[i];
                    String te = String.valueOf(isize);
                    char[] ints = te.toCharArray();
                    for(int d=0;d<te.length();d++) {
                        temp[k++] = ints[d];
                    }
                    leng = leng + 1 + te.length();
                    break;
                }
                
                if(j == size-1) {
                     temp[k++] = chars[i];
                     String te = String.valueOf(isize);
                     char[] ints = te.toCharArray();
                     for(int d=0;d<te.length();d++) {
                          temp[k++] = ints[d];
                     }
                     leng = leng + 1 + te.length();
                     
                }
            }
            
            i = i + isize;
        }
        char[] mm = new char[leng];
        for(int m=0;m<leng;m++) {
            mm[m] = temp[m];
        }
    
        if(leng >= chars.length) {
            return new String(chars);
        }
        return new String(mm);
    }
}

发表于 2020-04-25 20:56:00 回复(0)
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {
        // write code here
        StringBuilder sb = new StringBuilder();
        int len = iniString.length();
        for(int i = 0;i < len;){
            char c = iniString.charAt(i);  //记录当前字符
            int cnt = 1;  //初始计数为1
            while(++i < len && iniString.charAt(i) == c){
                cnt++;                    //向后遍历和当前字符相同时计数增加,不相同时跳出循环
            }
            sb.append(c).append(cnt);  //将当前字符的压缩结果添加进去,此时的 i 已经处在一个新字符处
        }
        return sb.toString().length() < iniString.length() ? sb.toString() : iniString;
    }
}
发表于 2020-04-07 14:58:34 回复(0)
思路清晰 一看就懂
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {
        // write code here
        StringBuilder sb = new StringBuilder();
        char base = iniString.charAt(0);
        int count = 1;
        sb.append(base);
        for (int i = 1; i < iniString.length(); i++) {
            char c = iniString.charAt(i);
            if (c == base) {
                count++;
            }else {
                //值不同 则重新开始计数
                sb.append(count);

                base = c;
                count = 1;

                sb.append(base);
            }
        }
        sb.append(count);
        return sb.toString().length() >= iniString.length() ? iniString : sb.toString();
    }
}
发表于 2020-03-17 13:44:21 回复(0)
import java.util.*;

public class Zipper {
    public String zipString(String iniString) {
        int flag=1;
        StringBuffer sb =new StringBuffer();
        sb.append(iniString.charAt(0));
        for(int i=0;i<iniString.length()-1;i++){
         
            if(iniString.charAt(i+1)==iniString.charAt(i)){
                flag++;
            }
            
            else{
               sb.append(flag);
               sb.append(iniString.charAt(i+1));
               flag=1;
            }
        }
        sb.append(flag);
        if (sb.length()>=iniString.length())
        {
                return iniString;
        }
        else
        {
            return sb.toString();
        }
    
        // write code here
    }
}

发表于 2019-09-06 11:01:33 回复(0)
 /*直接新建一个小的数组,一旦数组越界则证明比等于或大于原数组,则返回原数组,
本机编译可以,但是这里报错了,有点晕
*/
try{ 
char[] strs=iniString.toCharArray(); char[] newStr=new char[strs.length-1]; int j=1;
    newStr[j++]=strs[0];
    newStr[j]='1'; for(int i=1;ilength;i++){ if(strs[i]==strs[i-1]){ if(newStr[j]=='9'){
                newStr[j++]='1';
                newStr[j]='0';
            }else{
                newStr[j]+=1;
            }
        }else{
            j++;
            newStr[j]=strs[i];
            j++;
            newStr[j]='1';
        }
    } return String.valueOf(newStr);
}catch(java.lang.ArrayIndexOutOfBoundsException e){ return iniString;
}

编辑于 2019-09-06 10:25:31 回复(0)
//思路用栈来实现每个字符和前一个字符的比较,看是否相同。
import java.util.*;

public class Zipper {
    public static void main(String[] args) {
        System.out.println(zipString("dfsbfakfannfeer"));
    }

        public static String zipString(String iniString) {
            Stack<Character> stack = new Stack<Character>();
            char[] chs = iniString.toCharArray();
            String returnStr = "";
            int num = 1;    //记录字符连续出现次数
            boolean flg = true;
            stack.push(chs[0]);    //压入第一个字符
            for (int i = 1; i < chs.length; i++) {    
                if (chs[i] == top(stack)) {
                    num++;
                    //当最后一个字符为连续字符
                    if(i == chs.length - 1){
                        returnStr += (new Character(chs[i-1])).toString();
                        returnStr += (new Integer(num)).toString();
                    }
                } else {
                    //当最后一个字符为不连续字符
                    if(i == chs.length - 1){
                        returnStr += (new Character(chs[i])).toString();
                        returnStr += (new Integer(1)).toString();
                    }
                    returnStr += (new Character(chs[i-1])).toString();
                    returnStr += (new Integer(num)).toString();
                    num = 1;
                    stack.push(chs[i]);
                }
                
            }
            
            //排除压缩后字符串没有变短的情况,即不出现连续字符
            if(iniString.length() * 2 == returnStr.length()){
                return iniString;
            }
            
            return returnStr;
        }
        
        //自定义取栈顶方法
        public static char top(Stack<Character> stack){
            if(!stack.empty()){
                char ch = stack.pop();
                stack.push(ch);
                return ch;
            }
            return '0';
        }
}

发表于 2019-07-31 19:48:11 回复(0)
public String zipString(String iniString) { char[] chara = iniString.toCharArray(); String first = iniString.substring(0,1); String result =first; boolean flag =false; boolean vaild =true; int count=1; for (int i=1 ;i
发表于 2019-07-25 20:27:25 回复(0)
import java.util。*;

//我是一直咸鱼...
public class Zipper {
    public String zipString(String iniString){
        //在这里写代码
        StringBuffer str = new StringBuffer();
        int count = 0;
        for(int i = 0; i <iniString.length(); i ++){
            if(i!= iniString.length() - 1 &&(iniString.charAt(i)== iniString.charAt(i + 1))) {
                count ++;
            } else {
                if(count!= 0){
                    count + = 1;
                    str.append(iniString.charAt(i)+“”+ count);
                    count = 0;
                } else {
                    str.append(iniString.charAt(i)+“”+ 1);
                }
            }
        }
        如果(str.length()> = iniString.length())返回iniString;
        return str.toString();
    }
}

发表于 2019-02-26 19:28:22 回复(0)