关于字符串压缩方法合集(java实现)

关于字符串压缩方法合集(java实现)问题一利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。给定一个stringiniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。解决方法使用StringBuilder…

大家好,欢迎来到IT知识分享网。关于字符串压缩方法合集(java实现)"

问题一

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。

解决方法

使用StringBuilder
StringBuilder 解决大量拼接字符串时产生很多中间对象问题而提供的类
提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置
例:str =“aaaabbccccddeaaa” 压缩为”4a2b4c2d1e3a”

代码

public String zipString(String iniString) {
		
		/**
		 * 字符串压缩 使用StringBuilder
		 * StringBuilder 解决大量拼接字符串时产生很多中间对象问题而提供的类
		 * 提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置
		 * 例:str ="aaaabbccccddeaaa" 压缩为"4a2b4c2d1e3a"
		 * **/
		StringBuilder sb = new StringBuilder();
		int len = iniString.length();
		int low = 0, high = 0;
		int count = 0;
		char c = ' ';
		
		while(low < len){
			high = low;
			c = iniString.charAt(low);
			while((high < len) && (iniString.charAt(high) == c)){
				high++;
			}
			count = high - low;
			sb.append(c);
			sb.append(count);
			low = high;
		}
		
		return (sb.toString().length() < len) ? sb.toString() : iniString;
	}

版权声明:本文为CSDN博主「奕起学习」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29606255/article/details/78477517

问题二

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-compression

443.压缩字符串

给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,返回数组的新长度

示例 1:

输入:
[“a”,“a”,“b”,“b”,“c”,“c”,“c”]

输出:
返回6,输入数组的前6个字符应该是:[“a”,“2”,“b”,“2”,“c”,“3”]

说明:
“aa”被”a2″替代。”bb”被”b2″替代。”ccc”被”c3″替代。

示例 2:

输入:
[“a”]

输出:
返回1,输入数组的前1个字符应该是:[“a”]

说明:
没有任何字符串被替代。

示例 3:

输入:
[“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]

输出:
返回4,输入数组的前4个字符应该是:[“a”,“b”,“1”,“2”]。

说明:
由于字符”a”不重复,所以不会被压缩。”bbbbbbbbbbbb”被“b12”替代。
注意每个数字在数组中都有它自己的位置。

解决方法

此题要求使用原地算法求解,即将压缩结果存在原chars[]数组中.
使用双指针即可求解此题.这里我们称由相同字符组成的字符串为相同字符序列.
指针t指示已压缩的结果的末尾,指针i指示未压缩字符串的开头.
遇到相同的字符,指针i便向后滑动,直到遇到不同字符.指针i滑动的距离即为相同字符序列的长度.

代码

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++;
            //若相同字符序列长度大于1
            if(i - temp > 1){
            	
            	//向结果中加入相同字符序列的长度的字符形式
            	//String.valueOf 将基本数据类型转化为String
                for(char c : String.valueOf(i - temp).toCharArray()){
                    chars[t++] = c;
                }
            }
        }
        //t即为已压缩的结果的长度
        return t;
    }

作者:FlyChenKai
链接:https://leetcode-cn.com/problems/two-sum/solution/shuang-zhi-zhen-fa-qiu-ya-suo-zi-fu-chuan-java-by-/

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14884.html

(0)
上一篇 2024-02-23 10:45
下一篇 2024-02-23 17:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信